我觉得你应该返回第一个或默认的客户:
mock.Setup(m => m.GetById(IsAny<int>())).Returns<int>(
id =>
customersRepo.FirstOrDefault(c => c.Id == id)
);
也请记住,你并不需要在嘲笑重新实现资源库的逻辑(即怪异非常脆弱)。这是模拟。你可以嘲笑任何你想要的结果,没有任何逻辑:
mock.Setup(m => m.GetById(42)).Returns<int>(new Customer { Id = 42 });
使用嘲笑验证互动 - 即你的资料库被称为预计法预计参数的客户。
如果你想测试一些服务的业务逻辑,那么服务是一个被测系统(SUT),你不应该嘲笑它。但是,如果你的服务同时具有业务逻辑和数据访问逻辑,那么它做的事情太多了。提取数据访问逻辑一些仓库类,它将实现接口:
public interface ICustomerRepository
{
Customer GetById(int id);
// other methods related to customr data access
}
然后,让你的服务依赖于该接口上(依赖倒置):
public class YourService
{
private readonly ICustomerRepository _repository;
// dependency injection
public YourService(ICustomerRepository repository)
{
_repository = repository;
}
public void ExecuteSomeBusinessLogic()
{
// your code will go here
}
}
然后写服务的测试。因此,服务需要依赖性(客户存储库),你应该嘲笑这种依赖性。并按照您的预期验证服务与依赖关系进行交互。例如。在ExecuteSomeBusinessLogic测试中,我们应该检查该服务会询问顾客,ID为42(是的,怪异的业务逻辑):
[Test]
public void ShouldPerformGoodStuffWhenCustomerFound()
{
// Arrange
var mockRepository = new Mock<ICustomerRepository>();
mockRepository.Setup(r => r.GetById(42)).Returns(new Customer { Id = 42 });
var service = new YourService(mockRepository.Object);
// Act
service.ExecuteSomeBusinessLogic();
// Assert
mockRepository.VerifyAll();
// check other stuff
}
如果你写的情况下测试时,没有在数据库中找到自定义,只安装不同的回报:
mockRepository.Setup(r => r.GetById(42)).Returns(null);
我不能相信这些设置按预期工作。这两个设置都返回一个'IEnumerable',但一个表示它返回一个'string',另一个表示它返回一个'int'。这两者都不是'IEnumerable '。 –