C# Azure函数单元测试错误(TimerTrigger.HttpFunction)
我目前正在遵循此指南向Azure功能应用程序添加测试 目前我已经构建了8个Azure函数,它们都工作得很好,我还添加了一个Functions.Tests项目,并在其中引用了Azure Functions项目 下面是函数。测试当前的样子C# Azure函数单元测试错误(TimerTrigger.HttpFunction),c#,azure,unit-testing,testing,azure-functions,C#,Azure,Unit Testing,Testing,Azure Functions,我目前正在遵循此指南向Azure功能应用程序添加测试 目前我已经构建了8个Azure函数,它们都工作得很好,我还添加了一个Functions.Tests项目,并在其中引用了Azure Functions项目 下面是函数。测试当前的样子 using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Xunit; namespace Functions.Tests { public class Functions
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中遇到以下错误
我已经尝试了VisualStudio中所有建议的修复,并查看了在线资源,但没有成功。也许我错过了一个推荐人?我不确定,因为我已经一字不差地遵循了指南
使用的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");
}
}
}在我看来,它缺少对您的azure functios项目的引用,请确保您已通过以下方式添加引用: 右键单击测试项目 选择“添加”菜单 选择参考 选择项目选项卡左侧菜单,然后标记功能项目的复选框 单击“确定”
假设所提供的包含函数的项目被引用,测试只需要安排和执行目标函数,如链接示例所示
[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);
}
还应避免使用异步void。重构这些测试以使用异步任务。HttpFunction和TimerTrigger在本例中是正在测试的Azure函数。您的函数类的名称是什么?这就是你应该使用的。还要避免使用async void重构这些测试以使用asyncTask@Nkosi我有一个名为Examples的c项目,它有几个函数,比如getEntity。在这种情况下,HttpFunction是否会更改为Examples.getEntity.Run?是的,就是这样。将其中一个函数添加到问题中,以便我们可以向您展示如何测试它。它们是静态函数还是实例函数?@Nkosi试图用我的应用程序中的相关函数替换HttpFunction,但是VS将只重新注册项目示例,而不是其中的azurefunctions。@Nkosi能够成功地用Exemplar.getCase.Run替换TimerTrigger,但是,HttpFunction不接受类似的替换。如果重复此步骤,则表明引用中正确引用了functions项目。我可以从测试项目调用Functions项目,但不能调用Functions项目中的单个Azure函数。这是可行的,我没有使用您描述的正确值,一旦我更改了它们,我的两个测试就通过了。我的第三个失败,值为Not found:C Timer trigger函数在执行,但我相信这是因为getCase函数中没有使用TimerTrigger。就重构任务的void而言,这是一个简单的切换还是我需要一些其他引用/扩展等…谢谢@MD9简单开关。只要把那些空的东西变成任务就行了。显然,需要使用System.Threading.Tasks;应该包括在内。