模拟依赖测试通过但验证方法调用失败
Mocking dependency Test passing but Verify method invocation failing
验证方法测试调用失败:
.Net Core 3.1, Framework 4.8
正在测试的方法:为简洁起见简化了代码。
public bool IsValidPhoneNumber(string value)
{
return value.Length == 10;
}
完成测试class(通过):
public class CustomersViewModelTest
{
private CustomerViewModel _sut;
private readonly Mock<ICustomerViewModel> _customerViewModel;
private readonly Mock<ICustomerRepository> _customerRepository;
private readonly Mock<IMapper> _mapper;
public CustomersViewModelTest()
{
_customerViewModel = new Mock<ICustomerViewModel>();
_customerRepository = new Mock<ICustomerRepository>();
_mapper = new Mock<IMapper>();
_sut = new CustomerViewModel(_customerRepository.Object, _mapper.Object);
}
[Fact]
public void PhoneNumberTest()
{
string phoneNumber = "123456789";
_customerViewModel.Setup(x => x.IsValidPhoneNumber(phoneNumber)).Returns(false);
bool result = _sut.IsValidPhoneNumber(phoneNumber);
Assert.False(result);
}
}
现在,如果我尝试验证方法调用,则测试失败:(断言已删除)
_customerViewModel.Verify(p => p.IsValidPhoneNumber(phoneNumber), Times.Once);
或者这个:
_customerViewModel.Verify(x => x.PhoneNumber(It.IsAny<string>()), Times.Once);
不要这样做。
您在测试设置中所做的是用不同的实现替换您想要测试的方法。
在您的断言中,您正在验证是否已调用原始实现,这不会发生,因为您已经替换了它。
永远不要替换你正在测试的东西的实现。模拟依赖关系但不要模拟被测系统。否则,你的测试没有意义。
验证方法测试调用失败: .Net Core 3.1, Framework 4.8
正在测试的方法:为简洁起见简化了代码。
public bool IsValidPhoneNumber(string value)
{
return value.Length == 10;
}
完成测试class(通过):
public class CustomersViewModelTest
{
private CustomerViewModel _sut;
private readonly Mock<ICustomerViewModel> _customerViewModel;
private readonly Mock<ICustomerRepository> _customerRepository;
private readonly Mock<IMapper> _mapper;
public CustomersViewModelTest()
{
_customerViewModel = new Mock<ICustomerViewModel>();
_customerRepository = new Mock<ICustomerRepository>();
_mapper = new Mock<IMapper>();
_sut = new CustomerViewModel(_customerRepository.Object, _mapper.Object);
}
[Fact]
public void PhoneNumberTest()
{
string phoneNumber = "123456789";
_customerViewModel.Setup(x => x.IsValidPhoneNumber(phoneNumber)).Returns(false);
bool result = _sut.IsValidPhoneNumber(phoneNumber);
Assert.False(result);
}
}
现在,如果我尝试验证方法调用,则测试失败:(断言已删除)
_customerViewModel.Verify(p => p.IsValidPhoneNumber(phoneNumber), Times.Once);
或者这个:
_customerViewModel.Verify(x => x.PhoneNumber(It.IsAny<string>()), Times.Once);
不要这样做。
您在测试设置中所做的是用不同的实现替换您想要测试的方法。
在您的断言中,您正在验证是否已调用原始实现,这不会发生,因为您已经替换了它。
永远不要替换你正在测试的东西的实现。模拟依赖关系但不要模拟被测系统。否则,你的测试没有意义。