我应该如何用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
...
}
希望这可以帮助。
链接地址: http://www.djcxy.com/p/54057.html