Dockerized интеграционный тест подключения приложения ASP.NET Core к RabbitMQ - PullRequest
0 голосов
/ 08 ноября 2019

Я очень новичок в мире докертизированного тестирования интеграции, поэтому заранее извиняюсь, если вопрос звучит очень тривиально.

У меня есть приложение ASP.NET Core, которое взаимодействует с докеризованным экземпляром RabbitMQ. Когда я запускаю приложение для отладки, docker-compose создает контейнер этого приложения и RabbitMQ, а затем приложение может установить соединение со службой RabbitMQ. Однако при запуске интеграционных тестов приложению не удается установить соединение со службой RabbitMQ.

У меня есть отдельная docker-compose для интеграционных тестов, которая запускает службу RabbitMQ, которую я запускаю перед запуском интеграционных тестов.

Тест и настройка приложения довольно просты и следуют общей настройке и определяются как:

public class WebAPITest : IClassFixture<WebApplicationFactory<Program>>
{
    private readonly WebApplicationFactory<Program> _factory;

    public WebAPITest(WebApplicationFactory<Program> factory)
    {
        _factory = factory;
    }

    [Fact]
    public async Task IfConsumerReceives()
    {
        var client = _factory.CreateClient();
        var response = await client.GetAsync("/api/requestitems");

        // assert
        response.EnsureSuccessStatusCode();
    }
}

Приложение имеет сервис RabbitMQ, определенный следующим образом в Startupкласс:

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddMvc(options => options.EnableEndpointRouting = false)
        .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

    RegisterEventBus(services);
    services.AddOptions();
}

private void RegisterEventBus(IServiceCollection services)
{
    services.AddSingleton<IRabbitMQPersistentConnection>(sp =>
    {
        var factory = new ConnectionFactory()
        {
            HostName = Configuration["RabbitMQConnection:HostName"],
            Port = Configuration.GetValue<int>("RabbitMQConnection:Port"),
            DispatchConsumersAsync = true
        };

        factory.UserName = Configuration["RabbitMQConnection:UserName"];
        factory.Password = Configuration["RabbitMQConnection:Password"];
        var retryCount = int.Parse(Configuration["RabbitMQConnection:RetryCount"]);
        return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount);
    });

    var queueName = Configuration["QueueName"];
    services.AddSingleton<IEventBus, EventBusRabbitMQ>(sp =>
    {
        var rabbitMQPersistentConnection = sp.GetRequiredService<IRabbitMQPersistentConnection>();
        var iLifetimeScope = sp.GetRequiredService<ILifetimeScope>();
        var logger = sp.GetRequiredService<ILogger<EventBusRabbitMQ>>();
        var eventBusSubcriptionsManager = sp.GetRequiredService<IEventBusSubscriptionsManager>();

        var retryCount = int.Parse(Configuration["RabbitMQConnection:RetryCount"]);

        return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, queueName, retryCount);
    });

    services.AddSingleton<IEventBusSubscriptionsManager, InMemoryEventBusSubscriptionsManager>();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseHttpsRedirection();
    app.UseMvc();
    ConfigureEventBus(app);
}

private void ConfigureEventBus(IApplicationBuilder app)
{
    // The following fails to establish connection to RabbitMQ when running integration tests.
    var eventBus = app.ApplicationServices.GetRequiredService<IEventBus>();
    eventBus.Subscribe<CollectionCompletedIntegrationEvent, CollectionCompletedIntegrationEventHandler>();
}

Полученное сообщение об ошибке:

RabbitMQ.Client.Exceptions.BrokerUnreachableException: 'Ни одна из указанных конечных точек не была доступна'

Любые предложения горячо приветствуются.


Обновление 1

По запросу Docker создает файлы следующим образом;однако я не уверен, что эти файлы вызываются при выполнении интеграционных тестов, они вызываются только при отладке.

  • docker-compose
version: '3.4'

services:

  sql.data:
    image: microsoft/mssql-server-linux:2017-latest

  rabbitmq:
    image: rabbitmq:3-management-alpine

  myapp:
    image: ${DOCKER_REGISTRY-}myapp
    build:
      context: .
      dockerfile: myapp/Dockerfile
    depends_on:
      - sql.data
      - rabbitmq
  • docker-compose.override.yml:
version: '3.4'

services:
  sql.data:
    environment:
      - SA_PASSWORD=Pass_word
      - ACCEPT_EULA=Y
    ports:
      - "1433:1433"

  rabbitmq:
    ports:
      - "15672:15672"
      - "5672:5672"

  myapp:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_HTTPS_PORT=44376
    ports:
      - "61936:80"
      - "44376:443"
    volumes:
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...