我想为我的一个控制器编写单元测试,以验证视图是否正确返回,但此控制器有访问HttpContext.Current.Session的基本控制器。每次创建控制器的新实例时,都调用basecontroller构造函数,并且测试失败,HttpContext.Current.Session上出现空指针异常。下面是代码:ASP.NET MVC单元测试控制器与HttpContext
public class BaseController : Controller
{
protected BaseController()
{
ViewData["UserID"] = HttpContext.Current.Session["UserID"];
}
}
public class IndexController : BaseController
{
public ActionResult Index()
{
return View("Index.aspx");
}
}
[TestMethod]
public void Retrieve_IndexTest()
{
// Arrange
const string expectedViewName = "Index";
IndexController controller = new IndexController();
// Act
var result = controller.Index() as ViewResult;
// Assert
Assert.IsNotNull(result, "Should have returned a ViewResult");
Assert.AreEqual(expectedViewName, result.ViewName, "View name should have been {0}", expectedViewName);
}
如何嘲笑(使用MOQ)是在基本控制器访问,从而在后代控制器的测试将要运行的会话的任何想法?
如果我使用动作过滤器的方法,我将不得不装饰与此属性,并与ISN约400行动的每一个动作不可行 – amurra 2010-03-23 11:41:57
@ user299592:不,你不会的。您可以在课堂级应用它(如示例所示),并将其应用于该课程中的每个动作。如果你认为这将比为每个动作的每个测试嘲笑一个上下文(很少或没有实际使用你在构造函数中设置的字段)要花费更多的工作量,这足够公平。 – pdr 2010-03-23 12:17:40
您的正确我没有在课堂上看到它,但是在实例化控制器对象时仍不会调用动作过滤器吗? – amurra 2010-03-24 02:10:55