私はサガの単体テストを書こうとしています。SagaFixture を使用して Saga をホストし、FakeBus を使用しました。Saga 実行では、MessageContext を使用して戻りアドレスを取得しているため、FakeMessageContext も使用しました。
ここで、Fixture で Handle メソッドを呼び出そうとすると、NullReferenceException 型の例外がスローされます。
以下のコードを貼り付けます:
検索佐賀
public class SearchSaga : Saga<SearchSagaData>, IAmInitiatedBy<PersonRequested>, IHandleMessages<PersonSearchCompleted>
{
public void Handle(PersonRequested message)
{
Data.Id = new Guid(message.MessageId);
Data.ReturnAddress = MessageContext.GetCurrent().ReturnAddress;
Bus.Publish(message);
}
}
SagaUnitTest
[Test]
public void PublishResponseOfTypeSearchPersonRequest()
{
var bus = new FakeBus();
var saga = new SearchSaga(bus);
var fixture = new SagaFixture<SearchSagaData>(saga);
FakeMessageContext.Reset();
var fakeContext = MockRepository.GenerateMock<IMessageContext>();
fakeContext.Stub(s => s.ReturnAddress).Return("queuename");
fakeContext.Stub(s => s.Headers).Return(new Dictionary<string, object>());
// act
using (FakeMessageContext.Establish(fakeContext))
{
fixture.Handle(new PersonRequested {MessageId = Guid.NewGuid().ToString(), Query = "Abc"});
}
var sentRequests = bus.PublishedMessages.OfType<SearchPersonRequest>().ToList();
Assert.That(sentRequests.Count, Is.EqualTo(1));
}
エラー スタックトレース: Rebus.SagaContext..ctor(Guid id) at Rebus.Bus.Dispatcher.DispatchToHandler[TMessage](TMessage メッセージ、IHandleMessages 1 handler) at Rebus.Testing.SagaFixture
1.Handle[TMessage](TMessage メッセージ)