如何对Azure Webjobs V3进行集成测试?

时间:2019-08-26 22:34:24

标签: c# .net-core integration-testing azure-webjobs

Azure Webjob现在已安装在V3上,因此该答案不再是最新的(How to integration test Azure Web Jobs?

我想我们需要做这样的事情:

            var host = CreateHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            using (host)
            {
                var jobHost = host.Services.GetService(typeof(IJobHost)) as JobHost;
                var arguments = new Dictionary<string, object>
                {
                    // parameters of MyQueueTriggerMethodAsync
                };

                await host.StartAsync();
                await jobHost.CallAsync("MyQueueTriggerMethodAsync", arguments);
                await host.StopAsync();
            }

QueueTrigger函数

    public MyService(
        ILogger<MyService> logger
    )
    {
        _logger = logger;
    }

    public async Task MyQueueTriggerMethodAsync(
        [QueueTrigger("MyQueue")] MyObj obj
    )
    {
        _logger.Log("ReadFromQueueAsync success");
    }

但是在那之后,我怎么知道发生了什么事?

您建议能够对Azure Webjobs V3进行集成测试吗?

1 个答案:

答案 0 :(得分:2)

我猜这是一个交叉帖子with Github。产品团队建议查看自己的端到端测试,以获取有关如何处理集成测试的想法。

总结:

您以IHost身份can configureTestHost,并向其中添加集成服务。

public TestFixture()
{
     IHost host = new HostBuilder()
         .ConfigureDefaultTestHost<TestFixture>(b =>
         {
              b.AddAzureStorage();
         })
         .Build();

         var provider = host.Services.GetService<StorageAccountProvider>();
         StorageAccount = provider.GetHost().SdkObject;
}

测试看起来像这样:

/// <summary>
/// Covers:
/// - queue binding to custom object
/// - queue trigger
/// - table writing
/// </summary>
public static void QueueToICollectorAndQueue(
    [QueueTrigger(TestQueueNameEtag)] CustomObject e2equeue,
    [Table(TableName)] ICollector<ITableEntity> table,
    [Queue(TestQueueName)] out CustomObject output)
{
    const string tableKeys = "testETag";

    DynamicTableEntity result = new DynamicTableEntity
    {
        PartitionKey = tableKeys,
        RowKey = tableKeys,
        Properties = new Dictionary<string, EntityProperty>()
        {
            { "Text", new EntityProperty("before") },
            { "Number", new EntityProperty("1") }
        }
    };

    table.Add(result);

    result.Properties["Text"] = new EntityProperty("after");
    result.ETag = "*";
    table.Add(result);

    output = e2equeue;
}

设置特定测试的难度取决于您所使用的触发器和输出以及是否使用仿真器。