我目前正在为这个已经实现的控制器编写一些MSpec规范(是的,我知道这样做是"错误的"方式)。
这是一个简单的"问题,但我不确定我做错了什么,希望有人能指出我的方式错误。
我的控制器方法如下:
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。我应该将后者剔除吗?如果是这样,为什么?
答案 0 :(得分:1)
SetPageTitle
可能正在尝试访问单元测试中不可用的HttpContext
,您可能会{{1}}。不幸的是,由于您没有展示这种方法,因此很难提供更多帮助。