我有一個帶有受保護方法的基類,該方法在我要測驗的子類的公共方法中被呼叫。我沒有找到一種方法來最小化基本保護方法,以便在子類中更輕松地進行測驗。
public class MyBaseClass
{
protected virtual bool MyMethod(int number)
{
return number == 1;
}
}
public class MyChildClass : MyBaseClass
{
public bool DoSomething(int number)
{
return MyMethod(number);
}
}
[TestFixture]
public class MyChildClassTests
{
[Test]
public void Expected_Returns_False_WhenPassed_1()
{
var myChildClass = new MyChildClass();
// How do I mock MyMethod used in myBaseClass here?
// var mock = new Mock<MyBaseClass>();
// mock.Protected().Setup<bool>("MyMethod", ItExpr.IsAny<int>()).Returns(false);
// The above mock is correct, but it's in a different instance object than myBaseClass
var result = myChildClass.DoSomething();
Assert.AreEqual(false, result);
}
}
我無法更改類以獲得更好的架構,我必須盡我所能來實作單元測驗DoSomething(),到目前為止我所做的是模擬并準備方法使用的所有資料,但由于它在另一個類中,我我喜歡我MyChildClassTests不要做所有這些,而只是限制測驗DoSomething()。
我已經閱讀了有關部分模擬和許多其他問題和答案的資訊,但我無法讓它正常作業。
我很感激任何建議!
編輯:忘記放入public所有課程,在我的真實世界中,它們是公開的。
uj5u.com熱心網友回復:
class MyChildClassTests
{
[Test]
public void Expected_Returns_False_WhenPassed_1()
{
var myChildClass = new FakeChildClass();
var result = myChildClass.DoSomething(1);
Assert.AreEqual(false, result);
}
}
public class FakeChildClass: MyChildClass
{
protected override bool MyMethod(int number)
{
return number == 1;
}
}
uj5u.com熱心網友回復:
首先,確保您的課程是公開的。
如果不能,Moq 會抱怨無法代理它們。
public class MyBaseClass
{
public virtual bool MyMethod(int number)
{
return number == 1;
}
}
public class MyChildClass : MyBaseClass
{
public bool DoSomething(int number)
{
return MyMethod(number);
}
}
接下來,將您的基類方法公開。除非您這樣做,否則您將無法設定它。
之后,創建子物件的模擬并模擬父方法。
var mockChild = new Mock<MyChildClass>(){CallBase = true};
mockChild.Setup(x => x.MyMethod(It.IsAny<int>())).Returns(false);
拉出你的結果.... 結果將回傳 false,即使實際的實作會以 1 作為引數回傳 true。
var result = mockChild.Object.DoSomething(1);
當呼叫 DoSomething 方法時,您實際上會進入該方法的真正實作(如果您不相信我,請在上面設定一個斷點!) - 但是 MyMethod 的模擬版本會啟動。
uj5u.com熱心網友回復:
感謝大家的回復,收集所有我能夠得到我用例的實際答案的東西:
不改變MyBaseClassand MyChildClass:
public class MyBaseClass
{
protected virtual bool MyMethod(int number)
{
return number == 1;
}
}
public class MyChildClass : MyBaseClass
{
public bool DoSomething(int number)
{
return MyMethod(number);
}
}
我能夠模擬受保護的方法并為我節省大量作業和重復代碼(已經在 MyBaseClassTests 中)
[TestFixture]
public class MyChildClassTests
{
[Test]
public void Expected_Returns_False_WhenPassed_1()
{
var expected = false;
var myChildClass = new Mock<MyChildClass> {CallBase = true};
myChildClass.Protected().Setup<bool>("MyMethod", 1).Returns(expected);
var result = myChildClass.Object.DoSomething(1);
Assert.AreEqual(expected, result);
}
[Test]
public void Expected_Returns_True_WhenPassed_1()
{
var expected = true;
var myChildClass = new Mock<MyChildClass> {CallBase = true};
myChildClass.Protected().Setup<bool>("MyMethod", 1).Returns(expected);
var result = myChildClass.Object.DoSomething(1);
Assert.AreEqual(expected, result);
}
}
感謝大家的幫助!:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/406789.html
標籤:
上一篇:JestJs:對Axios的多個異步API呼叫獲取模擬實作給出相同的回應
下一篇:存根異步函式時遇到問題
