2016-03-15 1 views
1

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)?

Répondre

1

Cette ligne est incorrecte: this.Data.Id = message.MyObjectId.Id. Si vous avez vérifié la valeur Data.Id avant de l'écraser, vous auriez remarqué que la propriété avait déjà une valeur.

Vous n'attribuez pas l'ID de saga - c'est ce que fait Rebus. Et vous devriez laisser cette propriété tranquille :)

En ce qui concerne votre erreur - lorsque Rebus veut enregistrer des informations sur un message spécifique, il enregistre un nom court pour le type et l'ID de message, c'est-à-dire la valeur du rbs2-msg-id en-tête. En d'autres termes: Ce n'est pas la valeur de la propriété m.MyObjectId.Id, vous voyez, c'est l'ID du message. Étant donné que le projecteur saga est réinitialisé à chaque exécution de test, et que vous ne lui fournissez qu'un Event2 (qui n'est pas autorisé à lancer une nouvelle instance), la saga ne sera pas touchée.

+0

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... –