#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
то, что вы можете внедрить вместо этого на основе этого кода.
Используя это, вы можете создать клиент для использования, как показано в этом примере.