我正在使用Moq并想要模拟继承自ICloneable的接口。我正在使用Newtonsoft.Json将我的对象序列化和反序列化为克隆实例。
界面:
public interface ITestInterface : ICloneable
{
int Number { get; set; }
string Text { get; set; }
string MethodCallResult { get; set; }
void CallMe();
}
我正在尝试使用泛型来转换对象,但我不知道Moq将提供的代理的实际运行时类型。
通过以下方法使用调试器我可以看到运行时类型是代理,但通用“T”的类型是接口ITestInterface,它不能被序列化。如何使用带有泛型的真实运行时类型来序列化/反序列化这些对象?我只是将类型作为参数传递,但我不知道它在编译时。
private object CreateClone<T>(T item)
where T : class
{
var realRuntimeType = item.GetType(); //is a proxy created by Moq inheriting from the interface
var itemAsSerializedString = JsonConvert.SerializeObject( item );
return JsonConvert.DeserializeObject<T>( itemAsSerializedString ); //wont work, tries to instantiate interface
}
用法(请注意,通用参数是推断的,非显式的):
var mock = new Mock<ITestInterface>();
mock.Setup(m => m.Clone()).Returns(CreateClone(mock.Object));
例外:
Newtonsoft.Json.JsonSerializationException:无法创建Processus.Tests.ITestInterface类型的实例。 Type是接口或抽象类,无法实例化。