模拟依赖项测试通过但验证方法调用失败

时间:2020-10-26 04:24:18

标签: c# .net moq

验证方法测试调用失败: .Net Core 3.1,Framework 4.8

正在测试的方法:为简便起见,代码简化了

public bool IsValidPhoneNumber(string value)
{
    return value.Length == 10;
}

完整的测试课程(通过):

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);

1 个答案:

答案 0 :(得分:5)

不要这样做。

您在测试设置中所要做的就是用另一种实现方式替换您要测试的方法。

在您的断言中,您正在验证是否已调用原始实现,因为替换了该实现,这将不会发生。

切勿替换正在测试的东西的实现。模拟依赖项,但不要模拟正在测试的系统。否则,您的测试没有意义。