Я очень новичок в мире докертизированного тестирования интеграции, поэтому заранее извиняюсь, если вопрос звучит очень тривиально.
У меня есть приложение 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 создает файлы следующим образом;однако я не уверен, что эти файлы вызываются при выполнении интеграционных тестов, они вызываются только при отладке.
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