模拟一个返回只读结构的接口方法



我正试图在一个返回带有内部构造函数的只读结构的接口上模拟一个方法。既然我需要我的嘲笑回应在对象中具有一定的价值,那么如何实现这一点呢?我正在使用XUnit和Moq。

使用redis堆栈交换库的工作示例;这个接口IDatabase有一个方法StreamGroupInfo,响应对象是StreamGroupInfo。这个响应对象是带有内部构造函数的只读结构,所以我不能简单地创建对象的实例并分配我想要的值。

您可以使用Activator.CreateInstance

// Arguments to pass to internal constructor here in order
var args = new object[] { "name", 10, 20, "someId" };
// You need to leave the (Binder) and (CultureInfo) casts so that C# compiler would call the correct overload for Activator.CreateInstance
var obj = (StreamGroupInfo)Activator.CreateInstance(typeof(StreamGroupInfo), BindingFlags.NonPublic | BindingFlags.Instance, (Binder)null, args, (CultureInfo)null);

请注意,在上面的代码中,有两种类型转换似乎是不必要的(VisualStudio建议您删除它们(。但由于参数的值为null,C#无法知道参数类型。因此,它将采用Object类型,并将调用Activator.CreateInstance(type类型,params-Object[]args(重载,该重载将不起作用。您可以按照如下方式重写代码,以使VisualStudio建议您删除强制转换的代码静音,并且它只有两个额外的行/变量。

// Arguments to pass to internal constructor here in order
var args = new object[] { "name", 10, 20, "someId" };
Binder binder = null;
CultureInfo culture = null;
var obj = (StreamGroupInfo)Activator.CreateInstance(typeof(StreamGroupInfo), BindingFlags.NonPublic | BindingFlags.Instance, binder, args, culture);

最新更新