【问题标题】:Unit Testing MassTransit Consumer With XUnit使用 XUnit 对 MassTransit 消费者进行单元测试
【发布时间】:2019-09-02 15:36:53
【问题描述】:

我的团队刚刚开始使用 MassTransit,我们正试图弄清楚 IConsumer 实施的单元测试是如何工作的。 MassTransit 文档不完整,到目前为止我发现的所有示例都使用 NUnit。我们正在尝试将 XUnit 与 Moq 一起使用来进行单元测试。

我知道我们需要设置 MassTransit 测试工具的一个实例,它在 NUnit 中是通过 OneTimeSetup 完成的,并且为了复制我们应该在 XUnit 中使用 IClassFixture。不过,我正在努力让它与测试工具一起使用。

我在 MassTransit GitHub 上看到了 Chris Patterson 的 ConsumerTest_Specs.cs 示例,但我很难将它翻译成在 XUnit 和 Moq 中工作。 https://github.com/MassTransit/MassTransit/blob/master/src/MassTransit.Tests/Testing/ConsumerTest_Specs.cs

我正在尝试测试一个非常简单的消费者。它所做的只是接收消息,然后调用存储库。我想编写一个模拟存储库并验证存储库方法被调用的 XUnit 测试。

有没有人有任何例子说明如何做这样的事情?

public class NewVMRequestRejectedConsumer : IConsumer<INewVMRequestRejected>
{
    private readonly INewVMRequestRepository _newVMRequestRepository;

    public NewVMRequestRejectedConsumer(INewVMRequestRepository newVMRequestRepository)
    {
        _newVMRequestRepository = newVMRequestRepository;
    }

    public Task Consume(ConsumeContext<INewVMRequestRejected> context)
    {
        _newVMRequestRepository.AddReasonForRejection(context.Message.RequestId, context.Message.Reason);
        return Task.CompletedTask;
    }
}

【问题讨论】:

    标签: c# .net moq xunit masstransit


    【解决方案1】:

    由于ConsumeContext&lt;out T&gt;INewVMRequestRepository 是接口,因此使用moq 模拟它们没有问题,例如

    //Arrange
    var repository = new Mock<INewVMRequestRepository>();
    var sut = new NewVMRequestRejectedConsumer(repository.Object);
    
    //Act
    sut.Consume(Mock.Of<ConsumeContext<INewVMRequestRejected>>(m =>
        m.Message.RequestId == "id" && m.Message.Reason == "reason"));
    
    //Assert
    repository.Verify(m => m.AddReasonForRejection("id", "reason"), Times.Once);
    

    【讨论】:

    • 谢谢!!我应该能够弄清楚这一点。我想我认为 MassTransit 必须有某种诡计。愚蠢可能是一种负担。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 2011-07-19
    • 2019-02-24
    相关资源
    最近更新 更多