3 回答

TA貢獻(xiàn)1864條經(jīng)驗 獲得超6個贊
GetEnumerator我還通過模擬模擬中的呼叫來解決這個問題FeedResponse。但是,需要記住的是,如果您只是設(shè)置mockFeedIterator.HasMoreResults(true),您最終會陷入無限循環(huán)。
我通過使用 Moq 的Callback方法功能解決了這個問題。我將該HasMoreResults方法配置為返回 true,然后在該ReadNextAsync方法上設(shè)置回調(diào)以重新配置HasMoreResults為返回 false。這樣,它將while第一次進(jìn)入循環(huán),根據(jù)模擬GetEnumerator方法填充返回集合,然后退出循環(huán)并將該集合返回給測試方法。
var myItems = new List<MyItem>
{
new MyItem(),
new MyItem()
};
var feedResponseMock = new Mock<FeedResponse<MyItem>>();
feedResponseMock.Setup(x => x.GetEnumerator()).Returns(myItems.GetEnumerator());
var feedIteratorMock = new Mock<FeedIterator<MyItem>>();
feedIteratorMock.Setup(f => f.HasMoreResults).Returns(true);
feedIteratorMock
.Setup(f => f.ReadNextAsync(It.IsAny<CancellationToken>()))
.ReturnsAsync(feedResponseMock.Object)
.Callback(() => feedIteratorMock
.Setup(f => f.HasMoreResults)
.Returns(false));
var containerMock = new Mock<Container>();
containerMock
.Setup(c => c.GetItemQueryIterator<MyItem>(
It.IsAny<QueryDefinition>(),
It.IsAny<string>(),
It.IsAny<QueryRequestOptions>()))
.Returns(feedIteratorMock.Object);

TA貢獻(xiàn)1842條經(jīng)驗 獲得超22個贊
您可以模擬返回僅已定義的ReadNextAsync模擬。然后,您創(chuàng)建的 的將會傳遞到 的底層實現(xiàn)。FeedResponseGetEnumerator()GetEnumeratorListforeach
以下示例使用Moq,但您應(yīng)該能夠在實現(xiàn)中執(zhí)行類似的操作。
var mockFeedResponse = new Mock<FeedResponse<Thing>>();
mockFeedResponse
.Setup(x => x.GetEnumerator())
.Returns(
new List<Thing>
{
new Thing(),
new Thing()
}.GetEnumerator()
);

TA貢獻(xiàn)1824條經(jīng)驗 獲得超8個贊
無論如何,我通過更改代碼來訪問從 CosmosDB 收到的 FeedResponse 上的 Resource 字段來解決這個問題。在我的測試中,我能夠模擬 Resource 的返回值并獲得所需的結(jié)果。
- 3 回答
- 0 關(guān)注
- 207 瀏覽
添加回答
舉報