c# - 模拟返回只读结构的接口方法
问题描述
我试图在一个接口上模拟一个方法,该接口返回一个带有内部构造函数的只读结构。由于我需要我的模拟响应在对象中具有某些值,如何实现这一点?我正在使用 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);
请注意,在上面的代码中,有两种类型转换似乎是不必要的(Visual Studio 会建议您删除它们)。但是由于参数的值为null,所以C#无法知道参数类型。因此它将假定类型 Object 并将调用 Activator.CreateInstance(Type type, params object[] args) 重载,这将不起作用。您可以按如下方式重写代码以使 Visual Studio 建议您删除强制转换,并且它只是两个额外的行/变量。
// 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);
推荐阅读
- ruby-on-rails - 导航栏未显示在引导程序上
- java - 调用 GLES32 glGetDebugMessageLog 时出现 UnsupportedOperationException
- sql - 设置基于查询以替换循环以从给定日期填充所有记录的所有月末日期
- image - 将PNG图像转换为XImage格式
- rust - 别名具有生命周期的通用函数?
- sql - 加入两个查询以形成一个表 - 在 postgres
- typescript - 定义具有准确类型的对象数组
- python - Keras 权重平均
- python - 为什么下面的python代码会抛出内存错误?
- spring-boot - ClassNotFoundException:使用 MockRestServiceServer 时出现 org.junit.Assert 异常