我正在尝试 Moq Rabbit MQ 方法。
ValueTask BasicPublishAsync<TProperties>(string exchange, string routingKey,
bool mandatory, TProperties basicProperties, ReadOnlyMemory<byte> body,
CancellationToken cancellationToken = default)
where TProperties : IReadOnlyBasicProperties, IAmqpHeader;
以下的正确形式是什么:
mockRabbitModel.Setup(a => a.BasicPublishAsync<It.IsSubtype<IAmqpHeader>>(
It.IsAny<string>() /*exchange*/,
It.IsAny<string>() /*routingKey*/,
It.IsAny<bool>() /* mandatory*/,
// ??????,
It.Is<ReadOnlyMemory<byte>>(b =>
this.TestSentMessage(b, (expected, actual) =>
Assert.AreEqual(expected, actual.Command))),
It.IsAny<CancellationToken>()));
Moq 无法直接使用 TProperties,我已经看到了用 ??????
映射参数的各种想法由于您已使用
It.IsSubtype<IAmqpHeader>
作为 BasicPublishAsync
的通用参数,因此您应该对包装在 basicProperties
中的 It.IsAny
使用相同的类型。
这是代码的简化版本:
public interface IFoo
{
ValueTask BasicPublishAsync<TProperties>(string key1, TProperties properties);
}
那么嘲笑应该像这样完成:
var foo_mock = new Mock<IFoo>();
foo_mock.Setup(foo => foo.BasicPublishAsync<It.IsSubtype<int>>(It.IsAny<string>(), It.IsAny<It.IsSubtype<int>>()))
.Returns(() => ValueTask.FromException(new Exception("BlahBlah")));
在这里您可以找到工作示例代码:https://dotnetfiddle.net/zSEE5D