【发布时间】:2023-02-24 03:51:45
【问题描述】:
我已经按照 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 永远不会增加。
对此处正确文档的任何帮助或推导将不胜感激。
【问题讨论】:
标签: c# asp.net-core rabbitmq xunit nsubstitute