私は、操作が実行されたときにイベントを発生させるドメインオブジェクトに対して操作を呼び出すコマンドハンドラを持っています。対応するコマンドが送信されたときに、イベントハンドラがイベントを受け取ることをテストしたいと思います(下記を参照して、簡潔にするためにいくつかのコードは省略しています)。イベントハンドラ(MyEventConsumer.Consume)は、イベントメッセージがバス(この場合はループバックバス)にパブリッシュされても呼び出されません。何か案は?Masstransitでコマンドベースおよびイベントベースのシステムをテストする方法
//Test
[TestFixture]
public class TestSendCommandReceiveEvent
{
[Given]
public void installation_of_infrastructure_objects()
{
container.Register(Component.For<MyEventConsumer>().UsingFactoryMethod(() => new MyEventConsumer(_received)));
container.Register(
Component.For<IServiceBus>()
.UsingFactoryMethod(() => ServiceBusFactory.New(x => { x.ReceiveFrom("loopback://localhost/mt_client"); x.Subscribe(conf => conf.LoadFrom(container)); })));
}
[When]
public void sending_a_command()
{
var LocalBus = container.Resolve<IServiceBus>();
LocalBus.Publish(new DoSomething(_aggregateId));
}
[Then]
public void corresponding_event_should_be_received_by_consumer()
{
_received.WaitOne(5000).ShouldBeTrue();
}
}
public class MyEventConsumer : Consumes<SomethingDone>.All
{
private readonly ManualResetEvent _received;
public MyEventConsumer(ManualResetEvent received)
{
_received = received;
}
public void Consume(SomethingDone message)
{
_received.Set();
}
}
//Command handler
public class DoSomethingCommandHandler : Consumes<DoSomething>.All where T:class
{
public void Consume(DoSomething message)
{
var ar = Repository.GetById<SomeAR>(message.ArId);
ar.DoSomething();
Repository.Save(ar, Guid.NewGuid(), null);
}
}
//Domain object
public class SomeDomainObject : AggregateBase
{
public void DoSomething()
{
RaiseEvent(new SomethingDone(Id, 1));
}
}
は生産でこの作業を行い、単なるテストで失敗しますか?それはコードから大丈夫だと思われるが、私はコード内にいくつかのエラーがあると思うので、それが正しく接続されていると仮定している。私はメーリングリストに何が起こっているのかについてもう少し詳しく話し合うことを提案します。 https://groups.google.com/forum/#!forum/masstransit-discuss推測しなければならないのは、おそらくコンテナの問題です。私たちはそれらのすべてを考え出したと思うが、それは外れ値かもしれない。 – Travis
うーん、生産上の問題でもあるようです。バスを間違って設定している必要があります。ちょっと見てみます。 – Christian
ここで見つからないものは見えません(私自身のMT/Castleの経験がないことは例外です)。メーリングリストに移動する。 – Christian