[英]How do you mock an abstract class containing an internal abstract method using 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.