测试 MVC 中调用存储库的方法
Testing a method in MVC which makes calls to Repositories
我有一个像这样的 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' 属性,将其保存回来并 returns a 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(...)
活动 属性 的实际设置发生的条件。
由于传递的 productId 不是真实的,因此无法检索产品对象以供代码处理。
我尝试使用 Mock,但我认为我的用法不正确。
所以我想知道的是,如何测试这样的方法,其中 returns ActionResult 依次调用存储库以处理对象的方法。
提前致谢。
您似乎缺少
的设置
_updateProductsManager.UpsertProduct()
你设置 GetUpdateProduct
() 方法的方式你应该在模拟实例上设置 UpsertProduct
()。
我有一个像这样的 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' 属性,将其保存回来并 returns a 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(...)
活动 属性 的实际设置发生的条件。 由于传递的 productId 不是真实的,因此无法检索产品对象以供代码处理。
我尝试使用 Mock,但我认为我的用法不正确。
所以我想知道的是,如何测试这样的方法,其中 returns ActionResult 依次调用存储库以处理对象的方法。
提前致谢。
您似乎缺少
的设置_updateProductsManager.UpsertProduct()
你设置 GetUpdateProduct
() 方法的方式你应该在模拟实例上设置 UpsertProduct
()。