簡體   English   中英

如何測試與微服務通信的 controller?

[英]How to test a controller that communicate with a microservice?

我有下一個場景:我必須為控制器編寫一些單元測試。 在控制器中,我有所有類型的 CRUD 操作。 問題是,在發布/修補/刪除的操作中,我的 api 正在與 web 服務通信,我在其中傳遞了一些數據。 溝通是用guzzle完成的。

問題:當我調用路由時如何避免通信? 有沒有其他可能測試大廳controller?

我假設您的微服務是在 Laravel 的服務容器中注冊的 class。 據我所知,您不能在 Laravel 中模擬容器外的類。

因此,如果您不這樣做,請在AppServiceProvider class 的容器中注冊服務。 並從 controller 中的容器中獲取微服務,詳見此處

在您的單元測試中,您可以根據自己的需要制作一個微服務的模擬 object 並將其注入容器中(替換真實的)。 例如。

$this->instance(MyMicroService::class, Mockery::mock(MyMicroService::class, function ($mock) {
    // here you tell the mock object which method will be called and what to return and how many times it will be called. it's totally customizable.
    $mock->shouldReceive('contactRemoteServer')->once()->andReturnTrue();
}));

如果您在測試用例 class 中使用模擬方法會更容易,但它會做同樣的事情:

$this->mock(MyMicroService::class, function ($mock) {
    $mock->shouldReceive('contactRemoteServer')->once()->andReturnTrue();
});

有關更多示例,請參閱文檔

注意:如果您不知道,模擬 class 是專門為測試而制造的 class,因此它不會影響結果並且可以根據測試需要進行控制。

例如,如果您希望您的微服務將引發異常並且您想要測試控制器的響應,您將必須為每個單元測試創建一個模擬 class。

創建一個具有相同功能的示例 class 但我有一個問題,如果您正在創建單元測試並且您不想讓 guzzle 工作,那么您將測試什么。

請仔細閱讀文檔,您將獲得該選項。

在我的建議中,您可以使用 mocking。

暫無
暫無

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

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