2016-05-16 63 views
3

我需要測試使用MassTransit的訂戶。測試MassTransit Subsciber

下面是一個示例代碼:

using System; 
using MassTransit; 

public class AnimalSubscriber : Consumes<Animal>.Context 
{ 
    public void Consume(IConsumeContext<Animal> message) 
    { 
     //.. my code here.. 
    } 
} 

現在我有不知道如何測試用戶。如果有人能讓我知道一些細節;那會非常有幫助!

到目前爲止,我還以爲創建了AnimalSubscriber對象並調用了Consume方法。

[TestFixture] 
public class Test 
{ 
    [Test] 
    public void SearchAnimals() 
    { 
     AnimalSubscriber subscriber = new AnimalSubscriber(); 
     Animal request = new Animal 
     { 
      Id : 1, 
      Name : "Tiger" 
     }; 

     //Not sure how to mock this IReceiveContext. 
     IReceiveContext context = new ReceiveContext(); 

     IConsumeContext<Animal> message =new ConsumeContext<Animal>(context, request); 

     subscriber.Consume(null); 
    } 
} 

但我被困與下面的代碼行:

IConsumeContext<Animal> message =new ConsumeContext<Animal>(context, request); //<- Not sure how to mock this IReceiveContext. 

錯誤:類型 'MassTransit.Context.ReceiveContext' 沒有 構造函數定義

極品請一些建議!

回答

0

如果您正在使用MassTransit v2(基於您上面指定的接口的確如此),則可以使用Testing命名空間構建您的測試。

一個例子單元測試是在V2庫分支可供選擇:https://github.com/MassTransit/MassTransit/blob/v2-master/src/MassTransit.Tests/Testing/ConsumerTest_Specs.cs#L19

舉個例子,一個測試夾具可以設置爲建立自己的消費者和發送消息給它:

_test = TestFactory.ForConsumer<AnimalSubscriber>() 
    .InSingleBusScenario() 
    .New(x => 
     { 
      x.ConstructUsing(() => new AnimalSubscriber()); 

      x.Send(new Animal(), (scenario, context) => context.SendResponseTo(scenario.Bus)); 
     }); 

_test.Execute(); 

然後你可以建立一個圍繞該測試斷言,如:

_test.Sent.Any<A>().ShouldBeTrue(); 

注意,這僅與V2,該測試的名稱空間的作品,而目前在V3,做不完全正常工作(它沒有移動到async,我還沒有花時間完成它的工作)。