![](/img/trans.png)
[英]Moq, mockin an abstract class : the mocked object does cannot use methods implemented in the abstract class
[英]Moq abstract class methods results
public class Derived : BaseClass
{
public string PrintStringValue(string value)
{
var baseValue = base.GetTestString(value);
return baseValue;
}
}
public abstract class BaseClass
{
public virtual string GetTestString(string value)
{
return value + "from base class";
}
}
[TestFixture]
public class TestDerivedClass
{
private Mock<BaseClass> _mockBaseClass;
[SetUp]
public void Initialize()
{
_mockBaseClass = new Mock<BaseClass>();
}
[Test]
public void TestDerived()
{
_mockBaseClass.Setup(x => x.GetTestString(It.IsAny<String>())).Returns("My Mocked string value");
var result = GetDerived().PrintStringValue(It.IsAny<String>());
Assert.AreEqual("My Mocked string value", result); //this fails since the base method is
called
}
private Derived GetDerived()
{
return new Derived();
}
}
我想知道的是,當base.GetTestString(value)在派生的 class 而不是返回值+“來自基類”中執行時,是否有可能返回模擬結果( “My Mocked string value” ),這實際上是返回的。
更改您的Derived
class 以將this
稱為非base
類,這樣您就不會顯式使用基類的實現:
public string PrintStringValue(string value)
{
var baseValue = this.GetTestString(value);
return baseValue;
}
然后模擬Derived
,因為你不能模擬BaseClass
並讓它影響Derived
:
var mock = new Mock<Derived>() { CallBase = true };
mock.Setup(x => x.GetTestString(It.IsAny<string>())).Returns("Hello");
var obj = mock.Object;
Assert.Equal("Hello", obj.PrintStringValue("abc"));
您不能模擬BaseClass
並讓它影響Derived
的原因是因為 Moq 通過模擬的更改有效地創建了一個派生的 class 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.