通过模板方法使用Moq

问题描述 投票:0回答:1

我正在尝试 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,我已经看到了用 ??????

映射参数的各种想法
c# moq
1个回答
0
投票

由于您已使用

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

© www.soinside.com 2019 - 2024. All rights reserved.