簡體   English   中英

MassTransit & RabbitMQ - 如何驗證消息已在容器化消費者內部得到處理?

[英]MassTransit & RabbitMQ - How to verify that messaged got processed inside of containerized consumer?

我正在為我的項目進行集成測試。 我已經容器化了 RabbitMQ 隊列,這個隊列的容器化消費者(使用 MassTransit)和容器化了這個消費者在處理消息期間調用的 API。

我的測試將一條消息推送到隊列,它被消費者接收,這就是我的問題所在 -從我的測試角度來看,有沒有辦法檢查容器內的這個消費者何時處理消息?
現在我只使用Thread.Sleep() 10 秒,然后運行我的斷言。 它有效,但顯然,隨着測試數量的增加,這變得乏味......

為此使用實際的 rabbitmq REST API 怎么樣? 從集成測試中,您可以使用基本身份驗證,並查詢隊列端點,例如

/api/queues/%2F/foo

在默認虛擬主機/ (url 編碼為 %2F)上查詢隊列foo 這將為您返回一個 JSON 數據結構,其中包含您可以通過 UI 看到的相同詳細信息(實際上 UI 也在使用這個 API),如下所示(被嚴重截斷)。

{
    "messages": 1,
    "messages_ready": 1,
    "messages_unacknowledged": 0
}

您可以輪詢此端點,直到messages等於 0。

這是我最終解決這個問題的方法:

我沒有提到我還運行了 Seq 服務器,因為我認為它與我的情況無關,但事實證明確實如此。 在消息使用方法的末尾,我放置了我用自定義屬性豐富的日志,該屬性指示此日志表示該消息已被處理。 然后在我的集成測試中,我設置了 Polly 策略,要求 Seq 提供此“處理完成”日志(當然具有正確的消息 ID),直到它出現(或直到設置超時)。 但是,我覺得@Driedas 的回答更簡單

也許這可以幫助你

https://event-driven.io/en/testing_asynchronous_processes_with_a_little_help_from_do.net_channels/

允許在測試中等待 rabbitmq 事件而不執行 thread.Sleep

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM