[英]Mock third-party interface with return type that has readonly props & internal ctor
我正在嘗試模擬我正在使用的第三方接口( EventStore ClientAPI / IEventStoreConnection ),特別是此方法:
Task<StreamEventsSlice> ReadStreamEventsForwardAsync(string stream, long start, int count, bool resolveLinkTos, UserCredentials userCredentials = null);
我遇到的問題是返回類型StreamEventsSlice
具有readonly
字段和internal
構造函數即
public class StreamEventsSlice
{
public readonly string Stream;
//other similar fields
internal StreamEventsSlice(string stream) //missing other fields
{
Stream = stream;
}
}
在我的測試代碼中,我使用Moq
ReadStreamEventsForwardAsyncMethod
事件存儲連接,設置ReadStreamEventsForwardAsyncMethod
,並嘗試設置返回類型,如下所示:
var connection = new Mock<IEventStoreConnection>();
connection.Setup(s => s.ReadStreamEventsForwardAsync(It.IsAny<string>(), It.IsAny<long>(), It.IsAny<int>(), It.IsAny<bool>(), It.IsAny<UserCredentials>())
.ReturnsAsync(new StreamsEventSlice { props here });
但是我無法設置屬性,或者調用構造函數而不是那個(我實際上只需要設置兩個屬性)
我已經嘗試制作一個擴展原始類的存根,然后返回它。 雖然我可以隱藏readonly屬性,但我在類中得到錯誤,說“StreamEventsSlice沒有帶0參數的構造函數”。 給它一個構造函數不起作用,因為我不能調用基本ctor,因為它是內部的。
當我無法實例化返回類型時,如何在接口上模擬方法?
@MindSwipe鏈接了兩個很好的答案,遺憾的是我不能用這個來構造一個對象,因為構造函數的一個參數也被設置為internal。 相反,我必須使用此方法 ,並使用他們的其他建議來設置屬性。
我保留了大部分模擬設置代碼,然后添加並使用以下方法實例化StreamEventsSlice
internal StreamEventsSlice GetStreamEventSlice(ResolvedEvent[] events = null, bool isEndOfStream = true)
{
events = events ?? new ResolvedEvent[0];
var type = typeof(StreamEventsSlice);
var slice = (StreamEventsSlice) FormatterServices.GetUninitializedObject(type);
type.GetField("Events").SetValue(slice, events);
type.GetField("IsEndOfStream").SetValue(slice, isEndOfStream);
return slice;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.