【问题标题】:Moq for Azure Function service call Unit Test does not return the Setup valueAzure 函数服务调用单元测试的起订量不返回设置值
【发布时间】:2020-12-08 06:46:04
【问题描述】:

我有一个从 Azure 表中检索值的服务类 (DataStore.cs)。我正在测试将服务类用于成功案例的方法。 Service类方法的Mock没有返回预期值(返回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);
        }
    }

服务类方法签名为:

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

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

我对服务的调用如下:

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

我错过了什么?

【问题讨论】:

    标签: c# azure unit-testing async-await moq


    【解决方案1】:

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

    所以它们与设置不匹配。

    尝试使用It.IsAny&lt;AzureTableKey&gt;() 来验证我的声明。

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

    【讨论】:

    • 非常感谢!这很好用。虽然我使用了“.ReturnAsync”,尽管两者都有效。
    • 他们在做同样的事情,一个是同步的,另一个是异步的。
    猜你喜欢
    • 2017-04-23
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 2016-10-04
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多