[英]How should I mock this abstract class with Moq?
這並不是Moq特有的,而是更多的一般Mocking框架問題。 我為類型為“IAsset”的對象創建了一個模擬對象。 我想模仿從IAsset的getter返回的類型,“Info”。
var mock = new Mock<IAsset>();
mock.SetupGet(i => i.Info).Returns(//want to pass back a mocked abstract);
mock.SetupProperty(g => g.Id, Guid.NewGuid());
我遇到的問題是模擬這個返回的屬性值。
mock.SetupGet(i => i.Info).Returns(//this is the type I need to mock);
該屬性包含抽象類型。 此類型擴展了XDocument。
public abstract class SerializableNodeTree : XDocument, ISerializable{...}
那么......我想做的是:
var nodeTreeMock = new Mock<SerializableNodeTree>();
nodeTreeMock .SetupGet(d => d.Document).Returns(xdoc);
xdoc是一個XDocument實例。 這不起作用,因為XDocument.Document getter不是虛擬的。 這是有道理的。
我應該只是手工編寫一個從SerializableNodeTree派生的模擬代碼,還是有辦法模擬這個對象?
在這種情況下,我會將XDocument視為標准的,不可模擬的對象,如string
s和大多數POCO和本機類型。 也就是說,你應該創建一個真實的(非模擬的)SerializableNodeTree來從IAsset.Info
返回。
另一個選擇是使SerializableNodeTree
實現一個包含您想要模擬的所有方法的接口,並讓IAsset.Info
返回該接口類型而不是SerializableNodeTree
。
在這種情況下,我將創建一個派生自您的抽象類的測試雙精度。 這將為您提供測試所需的內容。
public class SerializableNodeTreeDouble : SerializableNodeTree
{
public new XDocument Document
{
get;
set;
}
...
}
public void TestMethod()
{
SerializableNodeTreeDouble testDouble = new SerializableNodeTreeDouble();
testDouble.XDocument = xdoc; // your xdoc
...
}
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.