簡體   English   中英

起訂量摘要 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.

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