亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 CosmosSDK v3+ 的 FeedResponse 中提供模擬值?

如何在 CosmosSDK v3+ 的 FeedResponse 中提供模擬值?

PHP
牧羊人nacy 2024-01-20 21:32:28
我正在為我的應用程序編寫一個數據訪問層,并嘗試模擬 CosmosDB SDK 依賴項以進行單元測試。我將 NUnit 與 NSubstitute 一起使用,并遇到了嘗試模擬 Container.GetItemQueryIterator 的返回值的問題。我已經成功提供了一個模擬 feedIterator 作為該調用的響應,并提供了一個模擬 feedResponse 作為 feedIterator.ReadNextAsync 的返回值,但我無法弄清楚如何將任何類型的值注入到 FeedResponse 中進行測試我試圖測試的代碼如下所示:var feedIterator = container.GetItemQueryIterator<T>(queryDefinition);  while (feedIterator.HasMoreResults){    result.success = true;    foreach (var item in await feedIterator.ReadNextAsync()){      list.Add(item);    }  }我嘗試模擬這樣的依賴關系(簡化):this.mockFeedResponse = Substitute.For<FeedResponse<T>>(this.mockApplicationList);         this.mockFeedIterator = Substitute.For<FeedIterator<T>>();this.mockFeedIterator.ReadNextAsync().ReturnsForAnyArgs(Task.FromResult(this.mockFeedResponse));this.mockFeedIterator.HasMoreResults.Returns(true);查看 AzureCosmosDB SDK 文檔,似乎有一個用于模擬的 FeedResponse 構造函數,它采用 IEnumerable 作為參數,但 NSubstitute 抱怨告訴我,當我嘗試傳入要使用的列表時,它找不到此構造函數。有沒有一種替代方案可以將一些 IEnumerable 作為 FeedResponse 提供?我哪里出錯了?
查看完整描述

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);


查看完整回答
反對 回復 2024-01-20
?
茅侃侃

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()

    );


查看完整回答
反對 回復 2024-01-20
?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

無論如何,我通過更改代碼來訪問從 CosmosDB 收到的 FeedResponse 上的 Resource 字段來解決這個問題。在我的測試中,我能夠模擬 Resource 的返回值并獲得所需的結果。



查看完整回答
反對 回復 2024-01-20
  • 3 回答
  • 0 關注
  • 185 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號