簡體   English   中英

預期在模擬上調用一次,但使用 Moq 為 0 次

[英]Expected invocation on the mock once, but was 0 times With 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 
    }
}

測試類 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 
}

我需要驗證是否調用了GenerateAddress 我還進行了Setup並為Address對象分配了值,但即使這些值也沒有設置……不知道出了什么問題。

看起來您正在使用“dddd”(4 天)調用Save ,但驗證它是用“ddddd”(5 天)調用的。

將真實數據放在變量中並在兩種情況下引用它更安全:

var name = "dddd";
objSaveAddress.Save(name);

genAddress.Verify(a=>a.GenerateAddress(name),Times.Once);

您正在使用手動創建的IGenerateAddress ( objGenAdress ) 和SaveAddress而不是genAddress

還考慮到 SUT 是只需要IGenerateAddressSaveAddress ,因此不需要其他模擬。

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

我認為在選擇回復后,如果我們重構代碼首先創建 SaveAddress 類作為模擬並傳遞參數 genAddress 並將 CallBase 屬性設置為 true。 此屬性的默認值為 false。 如果您不使用此參數,您的方法調用將返回 null,並且您會收到 this.post 標題錯誤。

        var genAddress = new Mock<IGenerateAddress>();

        var objSaveAddress = new Mock<SaveAddress>(genAddress.Object){CallBase = true};

        var name = "dddd";

        //Act
        objSaveAddress.Object.Save(name);

        //Assert
        //Verify if IGenerateAddress 'GenerateAddress' is called    
        genAddress.Verify(a => a.GetAddressFromA(name), Times.Once);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM