我有一个像这样的MVC方法:
public ActionResult ChangeStatus(string productId, string statusToChange)
{
var productToChangeStatus = _updateProductRepository.GetUpdateProduct(productId);
if (statusToChange.ToLower() == ChangeStatusTo.Disable)
{
productToChangeStatus.Active = "false";
}
else
{
productToChangeStatus.Active = "true";
}
_updateProductsManager.UpsertProduct(productToChangeStatus);
return Json(new { success = true });
}
此方法获取基于'productId'的现有产品,根据'statusToChange'值更改其上的'Active'属性,将其保存回来并成功返回Json。
测试设置如下:
private ProductController _controller;
private Mock<IUpdateProductRepository> _iProductRepository;
[TestInitialize]
public void TestSetup()
{
_iProductRepository = new Mock<IUpdateProductRepository>();
_controller = new ProductController(_iProductRepository.Object);
}
写了一个像这样的测试方法:
[TestMethod]
public void Disable_A_Product_Which_Is_Currently_Enabled()
{
const string productId = "123";
var productBeforeStatusChange = new Product()
{
Active = "true",
Id = new Guid().ToString(),
Name = "TestProduct",
ProductId = "123"
};
var productAfterStatusChange = new Product()
{
Active = "false",
Id = new Guid().ToString(),
Name = "TestProduct",
ProductId = "123"
};
_iProductRepository.Setup(r => r.GetUpdateProduct(productId)).Returns(productBeforeStatusChange);
_iProductRepository.Setup(r => r.UpsertProduct(productBeforeStatusChange)).Returns(productAfterStatusChange);
var res = _controller.ChangeStatus("123", "disable") as JsonResult;
Assert.AreEqual("{ success = true }", res.Data.ToString());
}
测试因此错误而失败:
Object reference not set to an instant of the object.
在调试时我发现它在
中失败了if(...)
发生Active属性的实际设置的条件。 由于传递的productId不真实,因此无法检索产品对象以供使用的代码。
我试图使用Mock,但我认为我的用法不正确。
所以我想知道的是,如何测试这样的方法,其中返回ActionResult的方法又调用存储库来处理对象。
提前致谢。
答案 0 :(得分:1)
您似乎缺少
的设置_updateProductsManager.UpsertProduct()
您设置GetUpdateProduct
()方法的方式应该在模拟实例上设置UpsertProduct
()。