Надежные функции и интеграционные тесты Azure

#azure #.net-core #azure-functions #integration-testing #azure-durable-functions

#azure #.net-core #azure-функции #интеграция-тестирование #azure-durable-функции

Вопрос:

Я пытаюсь протестировать (интеграционные тесты) мою Azure Durable Function v3 с помощью SpecFlow и MSTest.

Функции инициализируются с помощью DI и Startup class:

 [assembly: FunctionsStartup(typeof(Startup))]
namespace MyNamespace.Functions
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            ConfigureServices(builder.Services);
        }
...
 

Точка входа Orchestrator запускается конечной точкой HTTP:

 public class Function1
{
    [FunctionName(nameof(Function1))]
    public async Task<IActionResult> DoYourJob(
        [HttpTrigger(AuthorizationLevel.Anonymous, methods: "post", Route = "api/routes/function1")] HttpRequestMessage httpRequest,
        [DurableClient] IDurableOrchestrationClient starter)
        {
...
 

Мой конструктор IntegrationTest инициализирует функцию Az с HostBuilder помощью (благодаря этой статье):

 [Binding]
public sealed class Function1StepDefinitions
{
    private readonly IHost _host;
    private readonly Function1 _function;

    public Function1StepDefinitions()
    {
        var startup = new MyNamespace.Functions.Startup();
        _host = new HostBuilder()
            .ConfigureWebJobs(config =>
            {
                config.AddDurableTask(options =>
                {
                    options.HubName = "MyTaskHub";
                });

                startup.Configure(config);
            })
            .ConfigureServices(ReplaceTestOverrides)  // Method to replace/mock some external services
            .Build();

        _function = new Function1(Host.Services.GetRequiredService<IOptions..., ..);
 

И в моем тесте я не знаю, как получить IDurableOrchestrationClient для вызова моего HTTP-триггера:

     [When(@"I call my function")]
    public async Task WhenICallMyFunction()
    {
        var request = new HttpRequestMessage();

        await _function.DoYourJob(
            request,
            Host.Services.GetService<IDurableOrchestrationClient>()); // This is always null
...
 

Есть ли способ получить это IDurableOrchestrationClient и протестировать всю мою функцию (с помощью вызовов Orchestrator и Activities)?

Комментарии:

1. Это мой точный сценарий (вплоть до статьи, которую я использовал, чтобы убедиться, что мой DI будет таким же, как тестируемая система). Вы когда-нибудь находили способ сделать это?

2. Тем не менее, на данный момент я выполнил свои интеграционные тесты в развернутой среде (ничего не издеваясь …).

3. Сталкиваюсь с той же проблемой с надежным объектом. Было бы очень хорошо, если бы был способ протестировать его в конвейере CI / CD без фактического развертывания. Запустил щедрость, надеюсь, это поможет.

Ответ №1:

Похоже, что есть IDurableClientFactory то, что вы можете внедрить вместо этого на основе этого кода.

Используя это, вы можете создать клиент для использования, как показано в этом примере.