gpt4 book ai didi

c# - CosmosDB 中的模拟 ItemResponse

转载 作者:行者123 更新时间:2023-12-05 04:35:18 24 4
gpt4 key购买 nike

我正在使用 xUnit 中的 Moq 为涉及 CosmosDB 的服务编写单元测试。有一个方法GetVehicleInfo返回 ItemResponse<VehicleInfo>来自 CosmosDB。如ItemResponse有一个 protected 构造函数,所以我无法更新它。因此,我正在 mock 调用者方法并执行

var responseMock = new Mock<ItemResponse<VehicleInfo>>();
responseMock.Setup(x => x.Resource).Returns(expectedItem); //expectedItem is of VehicleInfo type
cosmoRepoServiceStub.Setup(service => service.GetVehicleInfo("a1", "a2").Result).Returns(responseMock.Object);

我面临的问题是当 GetVehicleInfo如下调用,它返回 null总是。我希望它返回 ItemResponse<VehicleInfo>其中Resource将包含expectedItem .

ItemResponse<VehicleInfo> response = await _cosmosRepo.GetVehicleInfo(plate, country);
if (response == null){ //... }

最佳答案

您应该像这样设置您的 cosmoRepoServiceStub:

cosmoRepoServiceStub
.Setup(service => service.GetVehicleInfo(It.IsAny<string>(), It.IsAny<string>()))
.ReturnsAsync(responseMock.Object);
  • GetVehicleInfo 参数应为设置方法中的任何字符串
  • 不要在方法选择器中调用 .Result,而是选择 ReturnsAsync
<小时/>

或者,如果您确实需要将 "a1" 作为第一个参数,则将其定义为

const StringComparison comparison = StringComparison.OrdinalIgnoreCase;
cosmoRepoServiceStub
.Setup(service => service.GetVehicleInfo(
It.Is<string>(param1 => string.Equals(param1, "a1", comparison),
It.Is<string>(param1 => string.Equals(param1, "a2", comparison)))
.ReturnsAsync(responseMock.Object);
<小时/>

更新#1反射(reflect)到评论

Why does It.IsAny work whereas "a1" does not?

Moq uses在底层使用 object.Equals 来检查 Setup 的参数与实际调用的参数。

这意味着值类型和字符串的比较基于它们的值(而不是基于它们的引用)。

因此,在您的特定情况下,这意味着 platecountry 不包含 a1a2 字符串分别。

简而言之,我应该工作,但作为一般经验法则

  • 使您的设置尽可能通用
  • 使您的验证尽可能具体

关于c# - CosmosDB 中的模拟 ItemResponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71064474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com