这并不是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派生的模拟代码,还是有办法模拟这个对象?
答案 0 :(得分:3)
在这种情况下,我会将XDocument视为标准的,不可模拟的对象,如string
和大多数POCO和本机类型。也就是说,你应该创建一个真实的(非模拟的)SerializableNodeTree来从IAsset.Info
返回。
另一个选择是让SerializableNodeTree
实现一个包含您想要模拟的所有方法的接口,并让IAsset.Info
直接返回该接口类型而不是SerializableNodeTree
。
答案 1 :(得分:0)
在这种情况下,我将创建一个派生自您的抽象类的测试双精度。这将为您提供测试所需的内容。
public class SerializableNodeTreeDouble : SerializableNodeTree
{
public new XDocument Document
{
get;
set;
}
...
}
public void TestMethod()
{
SerializableNodeTreeDouble testDouble = new SerializableNodeTreeDouble();
testDouble.XDocument = xdoc; // your xdoc
...
}
希望这有帮助。