Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MassTransit 4单元测试耗电元件超时_C#_Unit Testing_Nunit_Masstransit - Fatal编程技术网

C# MassTransit 4单元测试耗电元件超时

C# MassTransit 4单元测试耗电元件超时,c#,unit-testing,nunit,masstransit,C#,Unit Testing,Nunit,Masstransit,我在MT 3.5.7中的sagas中成功地使用了此测试模式,但现在在MT 4.0中,我使用InMemoryTestHarness测试来自消费者的消息的发布,并测试消费者,我得到了一个超时 通过test debug单步执行,我可以看到消费者被正确调用并发布其消息。消费者除了接收消息并发布新消息外,什么也不做 但是等待发布消息的\u harnese.subscribebhandler超时 为了简洁起见,下面的代码删除了我的容器注册和测试数据设置 [TestFixture] public class

我在MT 3.5.7中的sagas中成功地使用了此测试模式,但现在在MT 4.0中,我使用
InMemoryTestHarness
测试来自消费者的消息的发布,并测试消费者,我得到了一个超时

通过test debug单步执行,我可以看到消费者被正确调用并发布其消息。消费者除了接收消息并发布新消息外,什么也不做

但是等待发布消息的
\u harnese.subscribebhandler
超时

为了简洁起见,下面的代码删除了我的容器注册和测试数据设置

[TestFixture]
public class ConsumerTest
{
    InMemoryTestHarness _harness;
    ConsumerTestHarness<TCommandConsumer> _consumer
    ConsumeContext<ConsumerCompleted> _resultHandler;

    [OneTimeSetup]
    public async Task TaskSetup()
    {
      IContainer _container;
      //...container registrations and test data setup

      _harness = new InMemoryTestHarnes();
      _consumer = _harness.Consumer<TCommandConsumer>( () => _container.Resolve<TCommandConsumer>() );
      await _harness.Start();
      await _harness.InputQueueSendEndpoint.Send(new TCommand { Source = testdataSource, Topic = testdataTopic });
     _resultHandler = await _harness.SubscribeHandler<ConsumerCompleted>(); //Timeout here
    }
[TestFixture]
公共类消费者测试
{
内存测试线束_线束;
耗电元件线束\u耗电元件
ConsumerContext_resultHandler;
[一次性设置]
公共异步任务TaskSetup()
{
容器(i容器);;
//…容器注册和测试数据设置
_线束=新的内存线束();
_consumer=\u-harnese.consumer(()=>\u-container.Resolve());
等待线束启动();
wait _harness.InputQueueSendEndpoint.Send(新的TCommand{Source=testdataSource,Topic=testdataTopic});
_resultHandler=wait _harnese.SubscribeHandler();//此处超时
}
命令使用者(
TCommandConsumer
)成功接收从
InputQueueSendEndpoint.Send
发送的命令,并发布其响应(
ConsumerCompleted
),但我无法在测试夹具中处理该响应


我在这里遗漏了什么?

在MassTransit 4中,内存中的消息结构的行为与RabbitMQ相同。以前,内存中的消息将发布到每个端点,而不管该消息类型是否有绑定。现在,如果没有绑定,则不会传递消息

因此,您需要创建另一个接收端点,而不是使用
subscribebhandler
,并使用
Handled
检查消息是否已发布和接收


或者,您可以使用consumer测试线束上的
\u consumer.Published.Select.Any()
,查看它是否发布了事件,而不是检查它是否已被使用。

感谢您的w/kend响应!现在我已覆盖
ConfigureInMemoryReceiveEndpoint
并添加了
\u received=Handled(配置程序)
但是我仍然没有得到什么,因为当我在测试中收到
wait时,我仍然收到了超时错误。克里斯,谢谢你指出了正确的方向,在你的帮助下,我终于找到了答案,并查看了这里。忘记了我上面评论中的所有内容。启动测试工具后,我使用了我使用的
 _harnese.Host.ConnectReceiveEndPoint(“testqueue”,x=>{ResultHandle=Handled(x);})
然后能够
var result=wait resultHandle;
成功。