在MVC中测试一个方法来调用存储库

时间:2015-06-15 08:22:58

标签: asp.net-mvc unit-testing moq

我有一个像这样的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的方法又调用存储库来处理对象。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您似乎缺少

的设置
_updateProductsManager.UpsertProduct()

您设置GetUpdateProduct()方法的方式应该在模拟实例上设置UpsertProduct()。