使用 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.
中的任何逻辑/分支
我有这样的方法:
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.