【问题标题】:MSpec and base class test failure while writing test for Asp.net mvc 3 controller为 Asp.net mvc 3 控制器编写测试时 MSpec 和基类测试失败
【发布时间】:2011-04-15 21:43:35
【问题描述】:

我目前正在为这个已经实现的控制器编写一些 MSpec 规范(是的,我知道这样做是“错误的”方式)。

这是一个“简单”的问题,但我不确定我做错了什么,希望有人能够指出我的错误。

我的Controller的方法如下:

 public ActionResult Add()
    {
        this.SetPageTitle("Add something");
        return this.View();
    }

我遇到的问题是

this.SetPageTitle("Add something");

该方法在一个基类 (BaseController) 中定义,当前控制器 (CompanyHomeController) 从该基类中定义。

我的规格如下:

[Subject(typeof(CompanyHomeController))]
public class when_the_company_add_page_is_requested
{
    static string pageTitle;

    static ActionResult result;

    static CompanyHomeController companyHomeController;

    // Arrange
    Establish a_company_home_controller_context = () =>
        {
            var companyDao = A.Fake<ICompanyDao>();
            companyHomeController = new CompanyHomeController(companyDao);

            pageTitle = "Add something";
        };

    // Act
    Because of = () => result = companyHomeController.Add();

    // Assert
    private It should_display_a_view = () => result.ShouldBeAView();

}

当我运行测试时,它失败了,我收到了这条消息:

System.NullReferenceException: Object reference not set to an instance of an object.
at ..Commons.Hosts.Web.Mvc.Base.BaseController.SetPageTitle(String title) in C:\Projects\Commons\.Commons.Hosts\Web\Mvc\Base\BaseController.cs:line 87
at ..Hosts.Web.Areas.Company.Controllers.CompanyHomeController.Add() in C:\Projects\\Hosts\.Hosts.Web\Areas\Company\Controllers\CompanyHomeController.cs:line 93
at ..Hosts.Web.Specs.Areas.Company.Controllers.when_the_company_add_page_is_requested.<.ctor>b__1() in C:\Projects\Hosts\.Hosts.Web.Specs\Areas\Company\Controllers\CompanyHomeControllerSpecs.cs:line 43
at Machine.Specifications.Utility.RandomExtensionMethods.InvokeAll(IEnumerable`1 actions) in d:\BuildAgent-02\work\9f23de4d4da9eb12\Source\Machine.Specifications\Utility\RandomExtensionMethods.cs:line 32
at Machine.Specifications.Model.Context.EstablishContext() in d:\BuildAgent-02\work\9f23de4d4da9eb12\Source\Machine.Specifications\Model\Context.cs:line 86

我觉得它开花很明显,但我看不太清楚。由于 CompanyHomeController 是 SUT,我不太明白为什么我必须触及 BaseController。我应该把后者剔除吗?如果是这样,为什么?

【问题讨论】:

    标签: asp.net-mvc-3 mspec fakeiteasy


    【解决方案1】:

    SetPageTitle 可能正在尝试访问在单元测试中不可用的 HttpContext,而您可能会访问 need to mock。不幸的是,由于您没有展示此方法,因此很难提供更多帮助。

    【讨论】:

    • 你是对的,它正在尝试访问 HttpContext。你能解释一下为什么我需要嘲笑这个吗?由于一切都已经实现,我没想到我会嘲笑它,因为我已经预料到“因为 = () => result = companyHomeController.Add();”只需调用该方法。我的理解中缺少什么?
    • @DavidS,需要在单元测试中模拟 HttpContext。这仅在您运行应用程序时填充。在单元测试中,没有实例化上下文的 ASP.NET 管道。在经典的 ASP.NET 中,有一个无法模拟的静态 HttpContext.Current,但在 MVC 中,它是一个可以模拟的抽象基类。这就是为什么我们说 ASP.NET MVC 应用程序更容易进行单元测试。它使用可以模拟的抽象。 Because of ... 确实调用了该方法,但您的控制器没有您需要做的 HttpContext 设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多