簡體   English   中英

模擬具有只讀道具和內部ctor的返回類型的第三方界面

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM