2017-01-19 114 views
0

我正在使用Masstransit和RabbitMQ發佈事件(沒有消費者,只使用發佈者),而此刻我正在嘗試創建集成測試以驗證消息已發佈,如果是這樣,我想檢查它是否是正確的消息。要做到這一點,我創建一個消費者消費隊列中的消息,並將其與我的預期進行比較。這裏的問題是,我不能消費這個消息。該活動已成功發佈,但無法獲取消息。試圖從MassTransit消費者獲取消息

這是負責連接消費者

public class ServiceBusHelper 
{ 

    private IBusControl bus; 
    private readonly string serviceBusQueueName = ConfigurationManager.AppSettings["ServiceBusQueuename"]; 
    private readonly string serviceBusEndpoint = ConfigurationManager.AppSettings["ServiceBusEndPoint"]; 
    private readonly string serviceBusUsername = ConfigurationManager.AppSettings["ServiceBusUsername"]; 
    private readonly string serviceBusPassword = ConfigurationManager.AppSettings["ServiceBusPassword"]; 

    public ConnectHandle HandleObserver { get; set; } 

    public void ConnectRabbitMQ() 
    { 
     bus = Bus.Factory.CreateUsingRabbitMq(cfg => 
     { 
      var host = cfg.Host(
       new Uri(serviceBusEndpoint), 
       h => 
       { 
        h.Username(serviceBusUsername); 
        h.Password(serviceBusPassword); 
       }); 

      cfg.ReceiveEndpoint(
      serviceBusQueueName, 
      e => 
      { 

       e.Consumer<ServiceBusEventsHelper>(); 

      }); 
     }); 

     //Observer 
     var observer = new PublishedObserverHelper(); 
     HandleObserver = bus.ConnectPublishObserver(observer); 

    } 


} 

類,這是會消耗消息

public class ServiceBusEventsHelper : IConsumer<ITransportCreatedEvent> 
{ 
    public ITransportCreatedEvent Result { get; set; } 


    public async Task Consume(ConsumeContext<ITransportCreatedEvent> context) 
    { 
     Result = await Task.FromResult(context.Message); 

    } 


} 

和在測試方法的類我有此

  ServiceBusEventsHelper eventHelper = new ServiceBusEventsHelper(); 
     ServiceBusHelper busHelper = new ServiceBusHelper(); 

     try 
     { 
      busHelper.ConnectRabbitMQ(); 
      transportResponseDto = await this.transportClient.CreateTransportAsync(transportRequest); 
      handle = busHelper.HandleObserver; 

      var eventResponse = eventHelper.Result;// Allways NULL 
     } 
     catch (Exception ex) 
     { 
      Assert.Fail(ex.GetDetailMessage()); 
     } 

我試圖得到這樣的消息結果

var eventResponse = eventHelper.Result;// Allways NULL 

但是全部爲空。

有人可以幫我嗎?

我有一個服務,方法之一是CreateTransportAsync(),以及我稱之爲內發佈

public async Task<TransportResponseDto> CreateTransportAsync(TransportDto request){ 

    . 
    . 
    . 
    await this.RaiseTransportCreatedEvent(transportResponseDto); 
    } 

    private async Task RaiseTransportCreatedEvent(TransportResponseDto transportResponseDto) 
    { 
     var evt = CreateTransportEvent(transportResponseDto); 
     await this.serviceBus.Publish(evt).ConfigureAwait(false); 
    } 

public class ServiceBus<T> : IServiceBus<T> where T : class 
{ 
    private readonly IBus bus; 

    public ServiceBus(IBus bus) 
    { 
     this.bus = bus; 
    } 

    public Task Publish(T evt) 
    { 
     return bus.Publish(evt, evt.GetType()); 
    } 
} 

這是我的發佈事件,和它的作品。現在我試圖測試是否所有這些都與另一個解決方案中的集成測試一起工作,其中我試圖創建一個使用者從隊列中消費消息。然後,我想驗證該消息(將其與json文件中的假消息進行比較)以查看是否一切正常。問題是我無法得到這個消息,我不知道發生了什麼。 P.S:我真的不明白你試圖在一點要說3. 感謝

回答

0
  1. 您需要通過調用bus.Start()啓動總線什麼。你不這樣做,所以沒有收到任何東西。
  2. 目前還不清楚transportClient.CreateTransportAsync做什麼。誰在發佈消息?
  3. 消費者根據消費的消息被實例化。你在你的「測試」中做了什麼 - 你實例化一個消費者的實例並且繼續引用這個實例。然後你在某處發送消息。 MassTransit會爲您的客戶創建一個新實例,您會更新該字段,然後處理該實例。但是您正在檢查您最初創建的實例的Result,該實例從未收到任何消息。它將永遠是null
  4. 從發佈者向消費者傳遞消息需要時間。您在初始化公交車後嘗試檢查結果。我相當肯定你永遠不會得到這麼快,即使你修復(1),(2)和(3)

我不確定你到底想要測試什麼。使用MassTransit發佈和使用消息可處理所有傳輸。你可以從Github獲得任何樣本,構建它,運行它並看到它工作。

還有一些RabbitMQ運輸測試,顯示如何創建這樣的東西。例如,檢查ConsumerBind_Specs.cs文件。

此外,如果您想使用某個現有的消費者實例,則可以按照文檔Connecting an existing consumer instance中所述將此實例連接到總線。使用e.Instance而不是e.Consumer將使您的測試工作適當地等待Consume方法完成。但是,這並不是真正流行的方法,因爲您真的想將消費者範圍限制爲僅處理一個消息。

+0

感謝您的回覆!我不知道爲什麼bus.StartAsync()消失,但它在那裏,問題不是這樣。我想,就像你說的那樣,問題是我試圖快速訪問響應,而我不知道如何等待它。我走了告訴你更多的代碼,看看你是否可以幫助我 – EGM

+0

@EGM如果你想更新你的問題 - 做到這一點,不要爲此創建一個「答案」。本質上,你正在檢查一個永遠不會更新的對象的屬性 - 見第3點。我試圖更詳細地解釋它。 –

相關問題