我想爲我的一個控制器編寫單元測試,以驗證視圖是否正確返回,但此控制器有訪問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