使用 XUnit 对 MassTransit 消费者进行单元测试
Unit Testing MassTransit Consumer With XUnit
我的团队刚刚开始使用 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;
}
}
由于 ConsumeContext<out T>
和 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,我们正试图弄清楚单元测试 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;
}
}
由于 ConsumeContext<out T>
和 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);