簡體   English   中英

使用Moq,你如何模擬使用局部變量的方法

[英]Using Moq, How do you Mock a method that uses local variables

Moq的新手,這是一個非常簡單的例子。 我想模擬對我的“int smokeTest(int a,int b)”方法的調用,該方法在我的方法“string getCode(int someID)”中使用。 smokeTest的變量在getCode中聲明和設置。 問題是當我模擬對smokeTest的方法調用時,我總是在getCode中得到“0”的結果,但我想看到我的預定義結果“20”。 我發現的唯一工作是重載方法並傳入所有變量。 但是,我不想這樣做,因為我想要測試的許多方法都聲明並使用局部變量。 使用Moq測試此方法的最佳方法是什么? 謝謝

// Example A
public string getCode(int someID)
{
    int x = 5;
    int y = 5;
    int z = _dataAccess.smokeTest(x, y);

    return _dataAccess.getCode(someID);
}

// NOTE: Doesn't work as wanted
[Test]
public void test_getCode_TestB()
{
    var x = It.IsAny<int>();
    var y = It.IsAny<int>();

    // NOTE: "20" is not returned, 0 is returned instead because local variables are used
    _mockDataAccess.Setup(m => m.smokeTest(x, y)).Returns(20);
    _mockDataAccess.Setup(m => m.getCode(234)).Returns("def345");

    var result = _businessLogic.getCode(234);

    Assert.IsTrue(result == "def345");
}

// Example B

// NOTE: Workaround - pass in variables
public string getCode(int someID, int a, int b)
{
    var c = _dataAccess.smokeTest(a, b);
    return _dataAccess.getCode(someID);
}       

[Test]
public void test_getCode_TestC()
{
    var x = It.IsAny<int>();
    var y = It.IsAny<int>();

    // NOTE: "20" is returned as wanted
    _mockDataAccess.Setup(m => m.smokeTest(x, y)).Returns(20);
    _mockDataAccess.Setup(m => m.getCode(234)).Returns("def345");

    var result = _businessLogic.getCode(234, x, y);
    Assert.IsTrue(result == "def345");
}

只有將It.IsAny<int>()直接傳遞給moq設置時它才會起作用:

_mockDataAccess.Setup(m => m.smokeTest(It.IsAny<int>(), It.IsAny<int>())).Returns(20);

我正在瀏覽moq源代碼,發現這樣做:

int x = It.IsAny<int>();
int y = It.IsAny<int>();
_mockDataAccess.Setup(m => m.smokeTest(x, y)).Returns(20);

將x和y指定為int的deafult值為0,因此您的設置等同於:

_mockDataAccess.Setup(m => m.smokeTest(0, 0)).Returns(20); 

如果參數為0和0,此設置告訴moq返回20,否則它將返回int的deafult值,再次為0。 這不是您要創建的行為,因此在將它們傳遞到moq設置之前,不應將It.IsAny<int>()分配給x和y。

由於@Rob注釋表明It.IsAny<T>是一種可以傳遞到moq設置的存根,設置方法將知道如何使用表達式樹處理它,但此方法實際返回的值始終是這就是為什么我們必須總是直接在moq設置中使用這種方法。

暫無
暫無

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

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