我对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撰写的文件如下:;然而,我不确定这些文件是在运行集成测试时调用的,它们只在调试时调用。
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