J'ai ce simple Saga Rebus:Les tests unitaires des gestionnaires de Saga en rébus et des problèmes de corrélation
public void MySaga : Saga<MySagaData>
IAmInitiatedBy<Event1>
IHandleMessages<Event2>
{
private IBus bus;
private ILog logger;
public MySaga(IBus bus, ILog logger)
{
if (bus == null) throw new ArgumentNullException("bus");
if (logger == null) throw new ArgumentNullException("logger");
this.bus = bus;
this.logger = logger;
}
protected override void CorrelateMessages(ICorrelationConfig<MySagaData> config)
{
config.Correlate<Event>(m => m.MyObjectId.Id, s => s.Id);
config.Correlate<Event>(m => m.MyObjectId.Id, s => s.Id);
}
public Task Handle(Event1 message)
{
return Task.Run(() =>
{
this.Data.Id = message.MyObjectId.Id;
this.Data.State = MyEnumSagaData.Step1;
var cmd = new ResponseCommandToEvent1(message.MyObjectId);
bus.Send(cmd);
});
}
public Task Handle(Event2 message)
{
return Task.Run(() =>
{
this.Data.State = MyEnumSagaData.Step2;
var cmd = new ResponseCommandToEvent2(message.MyObjectId);
bus.Send(cmd);
});
}
}
et grâce au genre mookid8000 je peux tester la saga en utilisant FakeBus et SagaFixture:
[TestInitialize]
public void TestInitialize()
{
var log = new Mock<ILog>();
bus = new FakeBus();
fixture = SagaFixture.For<MySaga>(() => new MySaga(bus, log.Object));
idTest = new MyObjectId(Guid.Parse("1B2E7286-97E5-4978-B5B0-D288D71AD670"));
}
[TestMethod]
public void TestIAmInitiatedBy()
{
evt = new Event1(idTest);
fixture.Deliver(evt);
var testableFixture = fixture.Data.OfType<MySagaData>().First();
Assert.AreEqual(MyEnumSagaData.Step1, testableFixture.State);
// ... more asserts
}
[TestMethod]
public void TestIHandleMessages()
{
evt = new Event2(idTest);
fixture.Deliver(evt);
var testableFixture = fixture.Data.OfType<MySagaData>().First();
Assert.AreEqual(MyEnumSagaData.Step2, testableFixture.State);
// ... more asserts
}
[TestCleanup]
public void TestCleanup()
{
fixture.Dispose();
bus.Dispose();
}
La première méthode de test qui vérifie IAmInitiatedBy
est correctement exécutée et aucune erreur n'est générée, tandis que le deuxième test échoue. Cela ressemble à un problème de corrélation car fixture.Data
ne contient aucun élément et fixture.LogEvents
contient comme dernier élément cette erreur: Impossible de trouver les données saga existantes pour le message Event2/b91d161b-eb1b-419d-9576-2c13cd9d9c51.
Qu'est-ce que ce GUID? Est-ce complètement différent de celui que j'ai défini dans le test unitaire? Des idées? Est-ce que c'est légal ce que je suis à tester (puisque j'utilise un bus en mémoire)?
Je n'attribue pas un Id à la Saga parce que cela se produit dans la phase de corrélation, et c'est pourquoi même en supprimant la mauvaise ligne, l'ID de la saga est toujours égal à 'message.MyObjectId.Id'. Ai-je raison? Pour le second point, j'ai remplacé le '[TestInitialize]' par un '[ClassInitialize]' et ça fonctionne maintenant. Merci encore... –