Azure Function 服务调用单元测试的最小起订量不 return 设置值

Moq for Azure Function service call Unit Test does not return the Setup value

我有一个服务 class (DataStore.cs) 从 Azure Table 检索值。我正在测试使用服务 class 作为成功案例的方法。服务的 Mock class 方法没有 return 预期值(它 return 为 null)

正在测试的方法是

    public static class GetCellarBottleDetails
    {
        [FunctionName("GetCellarBottleDetails")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
            ILogger log, ExecutionContext context, IDataStore dataStore = null)
        {

            log.LogInformation("Begin GetCellarBottleDetails request");
            var stream = req.Body;
            stream.Seek(0, SeekOrigin.Begin);
            var azureTaskString = await new StreamReader(stream).ReadToEndAsync();
            var key = JsonConvert.DeserializeObject<AzureTableKey>(azureTaskString);
            if (key == null)
            {
                log.LogError($"Failed to Retrieve Bottle Details for Azure Table Key provided: {azureTaskString}");
                return new StatusCodeResult(400);
            }

            log.LogInformation("GetCellarBottleDetails Api Request initiated");

            dataStore ??= new DataStore(log, context);
            var result = await dataStore.GetCellarBottleDetails(key);

            if (result != null && result.GetType() == typeof(BottleDetailModel))
                return new OkObjectResult(JsonConvert.SerializeObject(result));
            log.LogError($"Failed to get bottle detail from DataStore.");
            return new StatusCodeResult(500);
        }
    }

服务class方法签名是:

public async Task<BottleDetailModel> GetCellarBottleDetails(AzureTableKey BottleId)

我的模拟和设置是:

var ds = TestHelpers.CreateMockDataStore();
ds.Setup(s => s.GetCellarBottleDetails(TestParams.TestExpectedAzureTableKeyForBottle))
              .Returns(Task.FromResult<BottleDetailModel>(TestParams.TestExpectedBottleDetailModel));
            //.ReturnsAsync(TestParams.TestExpectedBottleDetailModel); 

我已经根据其他 Whosebug 答案尝试了“.Returns”和“.ReturnsAsync”,它们都产生了 null 的结果。

我对服务的调用如下:

var sut = await GetCellarBottleDetails.Run(
                TestHelpers.CreateMockRequest(TestParams.TestExpectedAzureTableKeyForBottle).Object,
                TestHelpers.CreateMockLogger().Object,
                TestHelpers.CreateMockExecutionContext().Object, ds.Object);

我错过了什么?

AzureTableKey是一个对象。但是,您在 CreateMockRequest 函数中创建主体,AzureTableKey 的实例与对象反序列化期间创建的实例不同。

所以它们与设置不匹配。

尝试使用 It.IsAny<AzureTableKey>() 来验证我的声明。

 ds.Setup(s => s.GetCellarBottleDetails(It.IsAny<AzureTableKey>()))
              .Returns(Task.FromResult<BottleDetailModel>(TestParams.TestExpectedBottleDetailModel));