Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模拟第三方接口,返回类型为只读道具&;内科医生_C#_Unit Testing_.net Core_Mocking_Moq - Fatal编程技术网

C# 模拟第三方接口,返回类型为只读道具&;内科医生

C# 模拟第三方接口,返回类型为只读道具&;内科医生,c#,unit-testing,.net-core,mocking,moq,C#,Unit Testing,.net Core,Mocking,Moq,我试图模拟我正在使用的第三方接口(),特别是以下方法: 任务ReadStreamEventsForwardAsync(字符串流、长启动、int计数、bool resolveLinkTos、UserCredentials UserCredentials=null); 我遇到的问题是返回类型streameventslice具有只读字段和内部构造函数,即 公共类StreamEventsSlice { 公共只读字符串流; //其他类似领域 内部StreamEventsSlice(字符串流)//缺少其他

我试图模拟我正在使用的第三方接口(),特别是以下方法:

任务ReadStreamEventsForwardAsync(字符串流、长启动、int计数、bool resolveLinkTos、UserCredentials UserCredentials=null);
我遇到的问题是返回类型
streameventslice
具有
只读
字段和
内部
构造函数,即

公共类StreamEventsSlice
{
公共只读字符串流;
//其他类似领域
内部StreamEventsSlice(字符串流)//缺少其他字段
{
溪流=溪流;
}
}
在我的测试代码中,我正在使用
Moq
模拟事件存储连接,设置
readstreamventsforwardasynchmethod
,并尝试如下设置返回类型:

var connection=new Mock();
connection.Setup(s=>s.ReadStreamEventsForwardAsync(It.IsAny()、It.IsAny()、It.IsAny()、It.IsAny()、It.IsAny())
.ReturnsAsync(新StreamsEventSlice{props here});
但是我不能设置属性,也不能调用构造函数(实际上我只需要设置两个属性)

我已尝试创建一个扩展原始类的存根,并返回该存根。虽然我可以隐藏只读属性,但在该类上得到一个错误,即“StreamEventsSlice没有一个接受0个参数的构造函数”。为它指定一个构造函数不起作用,因为它是内部的,所以我无法调用基构造函数


当我无法实例化返回类型时,如何在接口上模拟方法?

@MindSwipe链接了两个很好的答案,不幸的是,我无法使用,因为构造函数的参数之一也设置为internal。相反,我必须使用,并使用他们的其他建议来设置属性

除了添加并使用以下方法实例化
streameventslice

内部StreamEventSlice GetStreamEventSlice(ResolvedEvent[]事件=null,bool isEndOfStream=true)
{
事件=事件??新的ResolvedEvent[0];
var类型=类型(StreamEventsSlice);
var slice=(StreamEventsSlice)FormatterServices.GetUninitializedObject(类型);
type.GetField(“事件”).SetValue(切片、事件);
type.GetField(“IsEndOfStream”).SetValue(切片,IsEndOfStream);
返回片;
}

您可以使用反射。向您展示了如何设置私有属性的值。并向您展示了如何实例化没有公共构造函数的对象,或者将第三方依赖性包装在您可以控制的抽象背后。此问题演示了与无法控制的代码紧密耦合相关的风险第三方界面的开发者认为他们很聪明。