我已经按照RabbitMQ文档(https://www.rabbitmq.com/tutorials/tutorial-seven-dotnet.html)提供的教程设置了一个MessageProducer
,发布者确认。
我使用XUnit和NSubstitute进行测试,现在我正在努力对为IModel _channel
定义的回调函数的功能进行单元测试。
如果我只是测试通道是否收到了预期数量的BasicPublish()
,则测试将运行到完成。
以下是我的服务方式:
public async Task SendMessagesWithConfirmAsync<T>(IEnumerable<T> messages, string queueName, string routingKey)
{
_channel.QueueDeclare(queueName, true, false);
_channel.ConfirmSelect();
// Register callbacks to handle acknowledgments
_channel.BasicAcks += (sender, ea) => CleanOutstandingConfirms(ea.DeliveryTag, ea.Multiple);
_channel.BasicNacks += (sender, ea) =>
{
_outstandingConfirms.TryGetValue(ea.DeliveryTag, out var body);
Console.WriteLine(
$"Message with body {body} has been nack-ed. Sequence number: {ea.DeliveryTag}, multiple: {ea.Multiple}");
CleanOutstandingConfirms(ea.DeliveryTag, ea.Multiple);
};
foreach (var message in messages)
{
var body = JsonSerializer.Serialize(message);
_outstandingConfirms.TryAdd(_channel.NextPublishSeqNo, body);
_channel.BasicPublish(queueName, routingKey, null, Encoding.UTF8.GetBytes(body));
}
await Task.CompletedTask;
}
在我的单元测试中,我希望确保回调事件被正确触发
[Theory]
[InlineData("Test 1", "Test 2", "Test 3")]
public async void SendMessageWithConfirm_MultipleMessages_ShouldPublishMessagesAndWaitForConfirmOrDie(
params string[] messages)
{
// Arrange
var messageProducer = new RabbitMqMessageProducer(_connectionFactory);
// Act
await messageProducer.SendMessagesWithConfirmAsync(messages, "invitations", "invitation");
// Assert
_channel.Received(messages.Length).BasicPublish(Arg.Any<string>(), Arg.Any<string>(),
null, Arg.Any<ReadOnlyMemory<byte>>());
// Assert on callback events
// ...
}
另一件事是_channel.NextPublishSeqNo
永远不会递增。
如果您能提供任何帮助或推导出正确的文档,我们将不胜感激。
1条答案
按热度按时间1zmg4dgp1#
对rabbit的单元测试根本不应该检查rabbit服务器。对于rabbitMQ服务器,您应该添加集成测试。
在单元测试中,您要检查代码,因此必须添加模拟rabbit MQ服务器的模拟。
我使用Xunit nuget进行单元测试,使用moq nuget模拟rabbitMQ,如下所示:
单元测试:
模拟: