【发布时间】:2016-03-01 15:07:32
【问题描述】:
这里是场景:
我正在为我的控制器编写一个测试,需要设置一个名为 CheckoutViewModel 的视图模型。我的控制器方法Products没有将CheckoutViewModel作为参数,所以不能这样传递。
目前,测试返回 Null Exception 失败,因为 CheckoutViewModel 未被设置和调用。
问题:如何使用数据设置我的
CheckoutViewModel。
错误详情:
System.NullReferenceException
对象引用未设置为对象的实例
当前测试
[TestMethod]
public void Products_ProductControllerIsCalled_ReturnsViewWithProducts()
{
// Arrange
var currentSession = _autoMoqer.GetMock<ICurrentSession>().Object;
ProductController productController = new ProductController(currentSession);
var checkoutViewModel = new CheckoutViewModel
{
CheckoutId = new Guid()
};
// Act
ActionResult result = productController.Products();
// Assert
Assert.IsInstanceOfType(result, typeof(ViewResult));
}
控制器
[AccectReadVerbs]
public ActionResult Products()
{
CheckoutViewModel checkoutViewModel = GetCheckoutViewModel();
var checkoutId = checkoutViewModel.CheckoutId;
var result = _productOrchestrator.Products(checkoutId, currentSession)
return View(result);
}
此方法失败
private CheckoutViewModel GetCheckoutViewModel()
{
if(Session["CheckoutViewModel"] == null)
{
return new CheckoutViewModel();
}
return (CheckoutViewModel)Session["CheckoutViewModel"];
}
【问题讨论】:
-
你能从你的控制器显示
Products()的代码吗? -
你能调试单元测试吗,就像进入代码一样?如果是这样,您能否确定
_productOrchestrator.Products(checkoutId, currentSession)是否实际上返回了不是NULL的result?我敢打赌这就是问题所在。 -
当然,在调用
GetCheckoutViewModel()方法时它失败了......它在if(Session["CheckoutViewModel"] == null)行上特别失败。 -
看起来你需要为你的单元测试模拟
Session对象。以How do you mock the session object collection using Moq为例。
标签: c# unit-testing tdd