我已经开始开发Azure Functions,现在我想创建我的第一个单元/集成测试,但我完全卡住了。虽然我有一个非常简单的函数,带有一个HTTP触发器和HTTP和存储队列输出,但它似乎非常复杂。
代码(简化):
public class MyOutput
{
[QueueOutput("my-queue-name", Connection = "my-connection")]
public string QueueMessage { get; set; }
public HttpResponseData HttpResponse { get; set; }
}
public static class MyFunction
{
[Function(nameof(MyFunction))]
public static async Task<MyOutput> Run(
[HttpTrigger(AuthorizationLevel.Function, "POST")] HttpRequestData req,
FunctionContext executionContext)
{
var logger = executionContext.GetLogger(nameof(MyFunction));
logger.LogInformation("Received {Bytes} bytes", req.Body.Length);
//implementation
}
}
现在我希望构建一个像这样的测试:
public async Task Test()
{
var response = await MyFunction.Run(..., ...);
Assert.IsNotNull(response);
}
我在互联网上找了几个小时来寻找一个好的方法,但仍然没有找到模拟HttpRequestData
和FunctionContext
的方法。我还通过设置服务器来寻找完整的集成测试,但这似乎真的很复杂。我唯一的结局是:https://github.com/Azure/azure-functions-dotnet-worker/blob/72b9d17a485eda1e6e3626a9472948be1152ab7d/test/E2ETests/E2ETests/HttpEndToEndTests.cs
有没有人有在.NET 5中测试Azure Functions的经验,谁能给予我一个正确的方向?有没有关于如何在dotnet-isolated中测试Azure函数的好文章或示例?
5条答案
按热度按时间bvjveswy1#
方案一
我终于可以嘲笑整件事了。肯定不是我最好的作品,可以使用一些重构,但至少我得到了一个工作原型:
方案二
我通过依赖注入添加了Logger,并为 HttpRequestData 和 HttpResponseData 创建了自己的实现。这更容易重用,并使测试本身更干净。
现在测试看起来像这样:
igetnqfo2#
为了补充您所做的工作,我尝试模拟
GetLogger()
,以便可以注入ILogger;不幸的是,GetLogger()
是一个扩展(静态的),所以它不能通过反射被模仿。我现在正在模拟GetLogger()
扩展(.Net source code)使用的字段。它看起来像这样:
afdcj2ne3#
调用Function的Run方法与其说是集成测试,不如说是一个单元。考虑一下您设置的一些中间件或身份验证,它们在直接调用Function时不会运行。
然而,目前似乎没有优雅的进程内方法来使用基于.NET 5的Azure隔离函数进行集成测试。参见:https://github.com/Azure/azure-functions-dotnet-worker/issues/541和https://github.com/Azure/azure-functions-dotnet-worker/issues/281
我通过在本地启动Azure函数主机“func”,托管我的函数,然后从测试本身使用普通的HttpClient,取得了一些成功。在此之前,您可以设置您不想模拟的其他依赖项,例如Azurite和一些blob数据。
noj0wjuj4#
您可以模拟上下文,并只提供您将从中使用的内容。这里有一种使用NSubstitute来获取ILogger的方法,您可以根据需要进行自定义:
webghufk5#
值得一提的是,这是我使用.NET 7和Azure Functions v4的实现。它扩展了@VincentBitter的工作,是一个可行的,多请求能力的HttpClientFactory模拟。
这里要注意的主要事情是添加了
System. out. println();*
单元测试模拟设置
MockHttpClientFactory
MockHttpResponse
MockHttpRequestData
MockHttpResponseData
用法
Azure函数方法
这个azure函数是用DI设置的,它使用了一个HttpClient对象。细节超出了本文的范围。您可以Google了解更多信息。
简单用例
更真实的用例