我该如何用Moq模拟这个抽象类?

时间:2011-07-28 21:34:25

标签: c# unit-testing mocking 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派生的模拟代码,还是有办法模拟这个对象?

2 个答案:

答案 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

   ...
}

希望这有帮助。