使用 Moq 测试存储库更新或插入

Testing Repository update or insert using Moq

我有这样的方法:

public int InsertOrUpdateCustomer(Customer customer)
{
var result = default(int);
try
{
    using (var customerContext = new Customer())
    {
        var customerResult = customerContext.UpdateGraph(coupon, map => map.OwnedCollection(p => p.CustomerPoints));
        couponsContext.SaveChanges();
        result = customerResult.CustomerTypeID;
    }
}
catch (Exception ex)
{
    // Log the Exception
}
return result;
}

它创建 CustomerContext 的一个实例,保存并 returns 新的 CustomerID。

我正尝试为此使用 Moq 并使用此方法,测试需要检查返回的整数值。

[TestMethod]
public void Inserting_A_Customer_Should_Return_A_IntegerValue(Customer customer)
{
    var mock = new Mock<ICustomerRepository>();
    int customerId = 1;
    mock.Setup(c => c.InsertOrUpdateCustomer(customer)).Returns(new Customer() { Id = customerId });
}

出现此错误:

cannot convert from 'Entities.Commerce.Customer' to 'System.Func<int>'

我也是Moq新手

我想从这个问题中了解的是,如果有人有上面的代码,那么如何编写单元测试。

如能给予一些指点,对了解该过程会有很大帮助。

提前致谢。

错误本身是因为您设置的方法是这个签名:

public int InsertOrUpdateCustomer(Customer customer)

而您的设置正在尝试 return 客户

 mock.Setup(c => c.InsertOrUpdateCustomer(customer))
     .Returns(new Customer() { Id = customerId });

将其更改为 return 一个假整数,例如 .Returns(42); 将避免错误。

不太好的消息是,如果测试的目的是 Inserting_A_Customer_Should_Return_A_IntegerValue,那么您将嘲笑您正在尝试测试的东西(您只是在测试最小起订量)。

你需要做的是将你的 DbContext 最小化,这使得这条线有问题,因为它的紧密耦合:

 using (var customerContext = new CustomerContext())

这里的建议是允许 DbContext 被注入到您正在测试的 class 的构造函数中(或者注入一个可以创建 DbContext 的工厂接口) .

然后您可以根据此 MSDN article here 模拟 DbContext 和相关的 IDbSets (Customers),然后您可以将其注入到正在测试的 class 中,并测试 class.

中的任何逻辑/分支