在使用 MassTransit 进行集成测试期间模拟 IRequestClient<>
Posted
技术标签:
【中文标题】在使用 MassTransit 进行集成测试期间模拟 IRequestClient<>【英文标题】:Mock IRequestClient<> during Integration Testing using MassTransit 【发布时间】:2022-01-20 04:15:02 【问题描述】:我正在尝试针对 MediatR 命令进行集成测试,该命令的处理程序依赖于注入到其构造函数中的 IRequestClient。
public class SayHelloCommand : IRequest<string>
public class SayHelloCommandHandler : IRequestHandler<SayHelloCommand, string>
private readonly IRequestClient<IGetProfileMessageResult> _profileClient;
public SayHelloCommandHandler(IRequestClient<IGetProfileMessageResult> profileClient)
_profileClient = profileClient;
public async Task<string> Handle(SayHelloCommand request, CancellationToken cancellationToken)
var profile = (await _profileClient.GetResponse<IGetProfileMessageResult>(new ProfileId = 1)).Message;
return $"Hello profile.FirstName";
我已将我的测试套件设置为使用 InMemoryMassTransit,但每当我运行测试时,它会在使用 IRequestClient 到达调用时超时。我也尝试过最小化 IRequestClient 以返回这样的默认响应 -
[Test]
public async Task ShouldSayHello()
var mockRequestClient = new Mock<IRequestClient<IGetProfileMessageResult>>();
mockRequestClient.Setup(x => x.GetResponse<IGetProfileMessageResult>(It.IsAny<Object>(), default, default)
.Result.Message).Returns(new GetProfileMessageResult
FirstName = "John"
);
serviceCollection.Add(new ServiceDescriptor(typeof(IRequestClient<IGetProfileMessageResult>), mockRequestClient.Object));
var result = await SendAsync(command);
result.Status.Should().BeFalse();
result.Message.Should().Contain("John");
但这仍然超时。
有没有办法可以设置 InMemoryMassTransit 在调用 requestclient 时返回默认响应?
【问题讨论】:
【参考方案1】:您可以使用内存中的测试工具来设置一个简单的消费者来响应请求,而不是尝试模拟 IRequestClient
。尽管您应该可以根据需要模拟它,但我只是不知道正确配置模拟框架的语法。
有许多使用可用测试工具的示例,以及所有 MassTransit 单元测试。
【讨论】:
所以你的意思是我应该在同一个服务中编写一个消费者来响应 IRequestClient 客户端调用并将其注册到像 x.Add.ConsumerTestHarness() 这样的设置中?你能指点我你提到的样品吗?顺便说一句,我使用的是起订量以上是关于在使用 MassTransit 进行集成测试期间模拟 IRequestClient<>的主要内容,如果未能解决你的问题,请参考以下文章
注册IConsumer 使用Autofac在Masstransit中依赖