测试 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()。