我应该如何用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

上一篇: How should I mock this abstract class with Moq?

下一篇: Silverlight in browser UnitTesting Mock<FileInfo>