代码之家  ›  专栏  ›  技术社区  ›  Dr. Strangelove

停靠集成测试ASP。NET核心应用程序与RabbitMQ的连接

  •  0
  • Dr. Strangelove  · 技术社区  · 6 年前

    我对Docked integration testing这个世界非常陌生,所以如果这个问题听起来很琐碎,我会提前向您道歉。

    我有一个ASP。NET核心应用程序,与停靠的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>();
    }
    

    我收到的错误消息是:

    兔子。客户例外。BrokerRunReachableException:'指定的终结点都不可访问'

    如有任何建议,我们将不胜感激。


    更新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
    
    0 回复  |  直到 6 年前