3 回答

TA貢獻1864條經驗 獲得超6個贊
GetEnumerator我還通過模擬模擬中的呼叫來解決這個問題FeedResponse。但是,需要記住的是,如果您只是設置mockFeedIterator.HasMoreResults(true),您最終會陷入無限循環。
我通過使用 Moq 的Callback方法功能解決了這個問題。我將該HasMoreResults方法配置為返回 true,然后在該ReadNextAsync方法上設置回調以重新配置HasMoreResults為返回 false。這樣,它將while第一次進入循環,根據模擬GetEnumerator方法填充返回集合,然后退出循環并將該集合返回給測試方法。
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貢獻1842條經驗 獲得超21個贊
您可以模擬返回僅已定義的ReadNextAsync模擬。然后,您創建的 的將會傳遞到 的底層實現。FeedResponseGetEnumerator()GetEnumeratorListforeach
以下示例使用Moq,但您應該能夠在實現中執行類似的操作。
var mockFeedResponse = new Mock<FeedResponse<Thing>>();
mockFeedResponse
.Setup(x => x.GetEnumerator())
.Returns(
new List<Thing>
{
new Thing(),
new Thing()
}.GetEnumerator()
);

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