簡體   English   中英

用MOQ的每個調用都有模擬方法輸出不同的out參數

[英]Have mocked method output different out param each call with MOQ

MOQ是否有辦法讓方法的順序調用返回不同的out參數? 作為獲取該方法的快速示例:

public void OutputANumber(out int number)

輸出1,然后輸出2(忽略它可能返回int的事實,這僅是示例而非真實代碼)。

int number = 1;
mock.Setup(n => n.OutputANumber(out number));
number = 2;
mock.Setup(n => n.OutputANumber(out number));

由於第二個設置優先於第一個設置,因此SetupSequence ,同樣, SetupSequence僅允許順序返回。

一種解決方案是使用回調將模擬傳遞到運行像這樣的新設置的方法中

int number = 1;
mock.Setup(n => n.OutputANumber(out number)).Callback(() => ChangeOut(mock));

void ChangeOut(Mock<type> mock)
{
    int number = 2;
    mock.Setup(n => n.OutputANumber(out number));
}

或者您可以創建一個虛擬對象,該對象可以跟蹤呼叫數量並根據需要輸出新值。

如果您只需要連續兩次調用,LukeW的解決方案就可以解決。 但是,如果序列較長,它將變得太復雜。 您可以使用Typemock Isolator輕松解決它。 看下面的例子:

public class ClassUnderTest
{
    public void OutputANumber(out int number)
    {
        number = 3;
    }
}

[TestMethod, Isolated]
public void TestOutSequence()
{
    //Arrange
    var n = new ClassUnderTest();

    int number = 1;
    Isolate.WhenCalled(() => n.OutputANumber(out number)).IgnoreCall();
    number = 2;
    Isolate.WhenCalled(() => n.OutputANumber(out number)).IgnoreCall();
    Isolate.WhenCalled(() => n.OutputANumber(out number)).CallOriginal();

    //Act
    var res1 = 0;
    var res2 = 0;
    var resOriginal = 0;
    var resDefault = 0;
    n.OutputANumber(out res1);
    n.OutputANumber(out res2);
    n.OutputANumber(out resOriginal);
    n.OutputANumber(out resDefault);

    //Assert
    Assert.AreEqual(1, res1);
    Assert.AreEqual(2, res2);
    Assert.AreEqual(3, resOriginal);
    Assert.AreEqual(3, resDefault);
}

無需創建虛擬對象或其他方法。 通過串行定義out參數並使用Isolate.WhenCalled(),可以設置任何out參數序列:

int number = 1;
Isolate.WhenCalled(() => n.OutputANumber(out number)).IgnoreCall();

從那時起,對Isolate.WhenCalled()的最后一次調用定義了該方法的默認行為。 因此,在該示例中,我返回了在虛假調用后要調用的原始實現:

Isolate.WhenCalled(() => n.OutputANumber(out number)).CallOriginal();

暫無
暫無

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

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