第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

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

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


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

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

    );


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

TA貢獻(xiàn)1824條經(jīng)驗 獲得超8個贊

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



查看完整回答
反對 回復(fù) 2024-01-20
  • 3 回答
  • 0 關(guān)注
  • 207 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號