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 关注
- 103 浏览
添加回答
举报