使用 ServiceBusTrigger 对 Azure 函数进行单元和集成测试

won*_*rld 0 unit-testing azure-servicebus-queues azure-functions

我有一个由Azure Service Bus Queue触发的 Azure 函数。

功能如下。

  1. 如何对这个 Run 方法进行单元测试?
  2. 以及如何通过从AddContact触发器开始、检查方法中的逻辑以及使用输出绑定发送到 blob 的数据来完成集成测试?
    public static class AddContactFunction
    {
        [FunctionName("AddContactFunction")]
        public static void Run([ServiceBusTrigger("AddContact", Connection = "AddContactFunctionConnectionString")]string myQueueItem, ILogger log)
        {
            log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
        }
    }
Run Code Online (Sandbox Code Playgroud)

snt*_*upl 5

我也有同样的疑问。添加单元测试并不太复杂,归根结底,它是一个函数,所以我们要做的就是使用正确的字符串调用 Azure 函数,作为参数string myQueueItem

添加集成测试需要一些额外的基础工作。在Github上项目,笔者采用了TestFunctionHost从类天青/ Azure的功能主机项目。

我尝试遵循此策略,但设置所有这些所需的代码量对我而言高得令人不舒服。没有很多文档被很好地记录下来,其中一些内容需要开发人员使用Azure App Services myGet feed

我想要一种更简单的方法,幸好我找到了一个。Azure Functions 构建在Azure WebJobs SDK 包之上,并利用其JobHost类来运行。因此,在我们的集成测试中,我们需要做的就是设置此主机,并告诉它在何处查找要加载和运行的 Azure 函数。

IHost host = new HostBuilder()
        .ConfigureWebJobs()
        .ConfigureDefaultTestHost<CLASS_CONTAINING_THE_AZURE_FUNCTIONS>(webjobsBuilder => {
            webjobsBuilder.AddAzureStorage();
            webjobsBuilder.AddServiceBus();
        })
        .ConfigureServices(services => {
            services.AddSingleton<INameResolver>(resolver);
        })
        .Build();

using (host) {
    await host.StartAsync();
    // ..
}
...
Run Code Online (Sandbox Code Playgroud)

完成此操作后,我们可以向 ServiceBus 发送消息,我们的 Azure Functions 将被触发。一次甚至可以在测试和调试问题的函数中设置断点!

我已经在这里写了关于整个过程的博客,我还在这个链接上创建了一个 github 存储库,以展示使用 Azure Functions 的测试驱动开发。