2016-03-31 12 views
0

Ich habe 2 Fragen Test Masstransit Verbraucher:Masstransit Verbraucher schwer zu testen

  1. Sync Ausgabe
  2. Message

Die erste ist wie folgt:

var testConsumer = TestFactory.ForConsumer<ImageUploadConsumer>().New(
       test => 
       { 
        test.UseConsumerFactory(new InstanceConsumerFactory<ImageUploadConsumer>(ImageConsumer));      
        test.Publish(message, (scenario, context) => 
        { 

        });      
       }); 

      testConsumer.Execute(); //Is non blocking 

Die folgende Zeile (unten) schlägt fehl, weil diese Zeile:

 moqFileMetaRepo.Verify(_ => _.Add(It.IsAny<IFileMeta>()),Times.Once); 

wird 9,9/10 vor ausgeführt ... diese Linie immer tat:

public async Task Consume(ConsumeContext<ImageUploadWithThumb> context) 

Mein fix war

moqFileMetaRepo 
      .Setup(repo => repo.Add(It.IsAny<IFileMeta>())) 
      .Callback(() => { AutoEvent.Set(); }); 

Und rufen Sie die folgende vor dem assert zu tun:

AutoEvent.WaitOne(TimeSpan.FromSeconds(10)); 

Das ist wirklich eine Menge Arbeit. Und macht TDD oder Testing im Allgemeinen zu einer Hektik, von der ich befürchte, dass sie nur mit der Zeit ignoriert wird.

MessageData Problem ist ein anderes. Hier ist die Nutzlast schicke ich durch

 message = new ImageUploadWithThumb() 
     { 
      Id = Guid.NewGuid(), 
      FileName = "Test.jpg", 
      User = "Me", 
      Extension = "jpg", 
      OriginalImage = new ConstantMessageData<byte[]>(new Uri("https://g00gle.com"), new byte[] { 1, 2, 3 }) 
     }; 

ich erwarte ich byte[] { 1, 2, 3 } am anderen Ende zu erhalten, ohne eine tatsächliche Ausdauer zu schaffen zu müssen.

Statt: Got an error

Auf der Senderseite die MessageData.Value ok löst. Der Verbraucher bombardiert völlig. Works in prod though = _ = was nicht der Test sein sollte.

Ich möchte wirklich nur spotten und UnitTest meine Verbraucher ohne das Framework - vorzugsweise in weniger als 5 Minuten oder so zu wrestlen. Gibt es einen Ausweg, während man bei MT3 bleibt?

Antwort

1

Ich würde vorschlagen, Blick auf die MassTransit.TestFramework Paket. Es erfordert NUnit, aber Sie könnten immer die Klassen nehmen und es zu Ihrem eigenen Test-Framework portieren.

Alle MassTransit Unit-Tests werden mit den Fixtures in diesem Framework geschrieben. Das Original. Testing Namespace ist in einer Welt der Verletzung nicht richtig, es hat nicht vollständig überlebt und ich bin mir nicht sicher, es funktioniert tatsächlich vollständig. Es war nicht für Async ausgelegt, daher war es schwierig, den Übergang durchzuführen, ohne es vollständig zu löschen.