mock返回只读结构的接口方法

gopyfrb3  于 2021-06-10  发布在  Redis
关注(0)|答案(1)|浏览(463)

我试图在一个接口上模拟一个方法,该接口返回一个带有内部构造函数的只读结构。既然我需要我的模拟响应在对象中具有特定的值,那么如何实现这一点呢?我用的是xunit和moq。
使用redis堆栈交换库的工作示例;此接口idatabase有一个方法streamgroupinfo,响应对象是streamgroupinfo。这个响应对象是带有内部构造函数的只读结构,所以我不能简单地创建对象的示例并分配所需的值。

nxowjjhe

nxowjjhe1#

可以使用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建议您删除它们)。但由于参数的值为空,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);

相关问题