如何(反)序列化接口的模拟?

时间:2018-08-16 07:50:54

标签: c# unit-testing serialization mocking moq

我正在测试一个方法,该方法将相当长的接口作为参数(25个属性),并且由于该接口具有多种实现,因此我想模拟它而不是使用实际对象。

其中一些属性包含超过6000个字符的字符串,因此将这些数据保留在代码中是毫无疑问的。在这种情况下,我会将数据保存在嵌入式资源中,这开始了我的问题。

这是示例界面:

public interface IComplexInterface
{
    string Content { get; set; }

    string Description { get; set; }

    string Title { get; set; }

    /* a lot more */
}

我试图先将我的硬编码模拟序列化为JSON,以了解它将采用什么结构,所以我可以存储它:

var mock = new Mock<IComplexInterface>();

mock.SetupGet(x => x.Content).Returns("around 6000-9000 characters");
mock.SetupGet(x => x.Description).Returns("another 2000 characters");
mock.SetupGet(x => x.Title).Returns("just few characters");
/* and so on */

var serializedMock_1 = JsonConvert.SerializeObject(mock);        // Mock<IComplexInterface>
var serializedMock_2 = JsonConvert.SerializeObject(mock.Object); // IComplexInterface

可悲的是,当我尝试反序列化其中任何一个时,我得到:

Mock<IComplexInterface>'ISerializable type 'Castle.Proxies.IComplexInterface' does not have a valid constructor. To correctly implement ISerializable a constructor that takes SerializationInfo and StreamingContext parameters should be present. Path 'Object', line 1, position 1022.

IComplexInterface'Could not create an instance of type MyApp.IComplexInterface. Type is an interface or abstract class and cannot be instantiated. Path '__interceptors', line 1, position 18.'

有什么办法可以做到,所以我可以将这个模拟存储在资源中吗?

1 个答案:

答案 0 :(得分:1)

通过创建自己的模拟类而不是Mock<your interface>。即实现该接口的类,该类仅用于测试目的。它可以从嵌入式资源或文件中加载其内容。