预期在模拟上调用一次,但使用 Moq 为 0 次

Haf*_*han 6 c# unit-testing moq

我收到一个错误

在模拟上调用一次,但为 0 次

下面是我的代码结构

public class GenerateAddress : IGenerateAddress 
{
    public GenerateAddress(IAddress createAdd, IValidate validate) {
       //constructor 
    }

    public Address GetAddressFromA(string name){..}
}

public class SaveAddress : ISaveAddress 
{
    public SaveAddress(IGenerateAddress generateaddress) {
        //constructor 
    }

    public bool Save(string name)
    {
        var address = generateaddress.GetAddressFromA(name);
        ......
        //Rest of the code to save 
    }
}
Run Code Online (Sandbox Code Playgroud)

测试类 SaveAddress 的测试方法

public void TestVerifyGetAddressIsCalled()
{
    var mockIAddress = new Mock<IAddress>();
    var mockValidate = new Mock<IValidate>();

    var genAddress = new Mock<IGenerateAddress>();

    var objGenAdress = new GenerateAddress(mockIAddress.Object, mockValidate.Object) // 

    var objSaveAddress = new SaveAddress(objGenAdress);

    objSaveAddress.Save("dddd");

    //Verify if IGenerateAddress 'GenerateAddress' is called

    genAddress.Verify(a=>a.GenerateAddress("ddddd"),Times.Once); // Throws Excepted Invocation 
}
Run Code Online (Sandbox Code Playgroud)

我需要验证是否GenerateAddress被调用。我也做了Setup并为Address对象分配了值,但即使这些值也没有设置..不知道出了什么问题。

Nko*_*osi 5

You are using an IGenerateAddress you created manually (objGenAdress) with SaveAddress instead of the mocked genAddress.

Also given that the SUT is the SaveAddress which only needed the IGenerateAddress, there is no need for the other mocks.

public void TestVerifyGetAddressIsCalled() { 
    //Arrange
    var genAddress = new Mock<IGenerateAddress>();

    var objSaveAddress = new SaveAddress(genAddress.Object);

    var name = "dddd";

    //Act
    objSaveAddress.Save(name);

    //Assert
    //Verify if 'IGenerateAddress.GenerateAddress' is called    
    genAddress.Verify(a => a.GenerateAddress(name), Times.Once);
}
Run Code Online (Sandbox Code Playgroud)