嗨,我有一個類似于以下的代碼:
public abstract class MyAbstractClass
{
public virtual string DoSomething(string s1, string s2)
{
return this.DoSomethingElse(s1 s2);
}
protected abstract string DoSomethingElse(string s);
}
[TestMethod]
public void Test()
{
var myMock = new Mock<MyAbstractClass>();
myMock.Protected().Setup<string>("DoSomethingElse", ItExpr.IsAny<string>()).Returns<string>(x => $"{x} I did it.");
var result = myMock.Object.DoSomething("a", "b");
}
我希望測驗中的結果是“我做到了”,但我得到了一個空值。我注意到,如果將“虛擬”洗掉到“DoSomething”方法,它將按預期回傳。問題是我需要這個方法是虛擬的。老實說,根據我對最小起訂量如何作業的理解,它應該回傳“我做到了”,但也許我遺漏了一些東西。
任何想法?謝謝
uj5u.com熱心網友回復:
原因是因為您使用模擬物件DoSomething呼叫方法,但是因為您沒有告訴模擬物件使用真正的實作或它,所以默認情況下它只是“什么都不做”(即回傳 null)。Setup
解決此問題的快速方法是設定CallBase = true模擬物件的屬性。然后,任何不是的方法都Setup將使用真正的實作。
var myMock = new Mock<MyAbstractClass>() { CallBase = true };
myMock
.Protected()
.Setup<string>("DoSomethingElse", ItExpr.IsAny<string>())
.Returns("DoSomethingElseResult");
Console.WriteLine("DoSomething: " myMock.Object.DoSomething("a", "b"));
這將列印“DoSomething:DoSomethingElseResult”,這應該正是您想要的。模擬物件DoSomething使用真實實作運行,真實實作DoSomething運行DoSomethingElse.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441642.html
