我正在测试一个方法,该方法将相当长的接口作为参数(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.'
有什么办法可以做到,所以我可以将这个模拟存储在资源中吗?
答案 0 :(得分:1)
通过创建自己的模拟类而不是Mock<your interface>
。即实现该接口的类,该类仅用于测试目的。它可以从嵌入式资源或文件中加载其内容。