繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM