【问题标题】:Azure Functions unit-testing errors (TimerTrigger. HttpFunction)Azure Functions 单元测试错误 (TimerTrigger.HttpFunction)
【发布时间】:2019-11-15 23:18:30
【问题描述】:

我目前正在按照本指南 (https://docs.microsoft.com/en-us/azure/azure-functions/functions-test-a-function) 向我的 Azure Functions 应用程序添加测试。

目前我已经构建了 8 个运行良好的 Azure Functions,我还添加了一个 Functions.Tests 项目并在其中引用了 Azure Functions 项目。

这是 Functions.Tests 当前的样子。

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Xunit;

namespace Functions.Tests
{
public class FunctionsTests
{
    private readonly ILogger logger = TestFactory.CreateLogger();

    [Fact]
    public async void Http_trigger_should_return_known_string()
    {
        var request = TestFactory.CreateHttpRequest("name", "Bill");
        var response = (OkObjectResult)await HttpFunction.Run(request, logger);
        Assert.Equal("Hello, Bill", response.Value);
    }

    [Theory]
    [MemberData(nameof(TestFactory.Data), MemberType = typeof(TestFactory))]
    public async void Http_trigger_should_return_known_string_from_member_data(string queryStringKey, string queryStringValue)
    {
        var request = TestFactory.CreateHttpRequest(queryStringKey, queryStringValue);
        var response = (OkObjectResult)await HttpFunction.Run(request, logger);
        Assert.Equal($"Hello, {queryStringValue}", response.Value);
    }

    [Fact]
    public void Timer_should_log_message()
    {
        var logger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List);
        TimerTrigger.Run(null, logger);
        var msg = logger.Logs[0];
        Assert.Contains("C# Timer trigger function executed at", msg);
    }
}
}

但是我在 FunctionsTests.cs 中收到以下错误

我已经尝试了 Visual Studio 中的所有建议修复程序并在线检查了资源,但没有运气。也许我缺少参考?我不确定,因为我已经逐字逐句地遵循了指南。

使用的示例 Azure 函数:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace Exemplar
{
public static class getCase
{
    [FunctionName("getCase")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", Route = "v1/case/caseId")] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

        return name != null
            ? (ActionResult)new OkObjectResult($"Hello, {name}")
            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
    }
}

}

【问题讨论】:

  • HttpFunctionTimerTrigger 在这种情况下是正在测试的 Azure 函数。名称或您的功能类是什么?那是你应该使用的。还要避免使用 async void 重构这些测试以使用 async Task
  • @Nkosi 我有一个名为 Examples 的 c# 项目,其中包含多个函数,例如 getEntity。在这种情况下,HttpFunction 会更改为 Examples.getEntity.Run 吗?
  • 是的,就是这样。 edit 将其中一项功能放入问题中,以便我们向您展示如何测试它。它们是静态函数还是实例函数?
  • @Nkosi 已尝试用我的应用程序中的相关函数替换 HttpFunction,但是 VS 只会识别项目“Exemplar”而不是其中的 azurefunctions。
  • @Nkosi 能够成功地将 TimerTrigger 替换为 Exemplar.getCase.Run,​​但是 HttpFunction 不接受类似的替换

标签: c# azure unit-testing testing azure-functions


【解决方案1】:

假设引用了包含该功能的提供的项目,则测试只需按照链接示例所示安排和执行目标功能

[Fact]
public async Task getCase_should_return_known_string()
{
    var request = TestFactory.CreateHttpRequest("name", "Bill");
    var response = (OkObjectResult)await getCase.Run(request, logger);
    Assert.Equal("Hello, Bill", response.Value);
}

[Theory]
[MemberData(nameof(TestFactory.Data), MemberType = typeof(TestFactory))]
public async Task getCase_should_return_known_string_from_member_data(string queryStringKey, string queryStringValue)
{
    var request = TestFactory.CreateHttpRequest(queryStringKey, queryStringValue);
    var response = (OkObjectResult)await getCase.Run(request, logger);
    Assert.Equal($"Hello, {queryStringValue}", response.Value);
}

同时避免使用async void。重构这些测试以改用async Task

【讨论】:

  • 这行得通,我没有使用你描述的正确值,一旦我改变了它们,我的两个测试就通过了。我的第三次失败,值为“未找到:C# Timer trigger function executed at”,但我相信这是因为 getCase 函数中没有使用 TimerTrigger。
  • 在将 void 重构为任务方面,它是一个简单的开关还是我需要一些其他参考/扩展等...谢谢!
  • @MD9 简单开关。只需将那些void 更改为Task 就可以了。显然应该包括所需的using System.Threading.Tasks;
【解决方案2】:

在我看来,它缺少对您的 azure functios 项目的引用,请确保您已通过以下方式添加了引用:

  • 右键单击您的测试项目
  • 选择菜单添加
  • 选择参考
  • 选择项目选项卡(左侧菜单),然后选中函数项目的复选框
  • 点击确定

【讨论】:

  • 重复了这一步,说明函数项目在引用中被正确引用了。我可以从测试项目调用函数项目,但不能调用函数项目中的单个 Azure 函数。
猜你喜欢
  • 2022-08-19
  • 2017-07-19
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 2014-10-24
相关资源
最近更新 更多