簡體   English   中英

我如何在 Laravel 工作中模擬服務 class?

[英]How can I mock a service class inside a Laravel Job?

我想模擬調用第三方的服務,但我無法弄清楚。

我有一個 controller 方法,它注入了服務並執行以下操作:

public function store(Request $request, MyService $myService)
{
    $data = $request->validated();

    $myService->create($data, $request->user());

    return response()->json();
}

在這項服務中,我調用了一個工作來做其他事情:

MyJob::dispatch($manager);

我的工作是這樣構建的:

public function __construct(private Manager $manager)
{
}

public function handle()
{
    // THE SERVICE I WANT TO MOCK
    $this->managementService = resolve(ManagementService::class, ['manager_id' => $this->manager->id]);
    $this->doStuff();
}

private function doStuff() {
    $this->managementService->startManagement();
}

在 ManagementService 中,我想模擬 function callApi:

public function startManagement()
{
    $data = $this->callApi('/thirdparty/call');

    return $data;
}

所以,在我的測試中,我嘗試模擬 ManagementService 並調用我的路線誰做所有這些事情

$this->mock(ManagementService::class, function ($mock) {
    $mock->shouldReceive('callApi')->andReturn('none');
});

$response = $this->actingAs(User::factory()->create())->post('/myroute', [
    'manager_id' => 4,
]);

但似乎這個模擬從未使用過,它仍然進入“正常”管理服務,因為當我在啟動測試時在 startManagement 方法中轉儲 $data 時,它沒有返回“無”。

我究竟做錯了什么?

謝謝

您發布的代碼不是很清楚,但是如果我理解正確的話,您喜歡模擬硬依賴,這就是為什么您的模擬從未調用過的原因,因為您從未注冊過它。

只需在 mock 方法中的 class 名稱之前添加字符串overload即可。

通過直接在工作中注入我的服務來解決這個問題

MyJob::dispatch($manager, resolve(ManagementService::class,  ['manager_id' => $this->manager->id]));

在服務實例內部,它通過構造函數而不是在句柄中

public function __construct(public Manager $manager, ManagementService $managementService)
{
    $this->managementService = $managementService;
}

然后在我的測試中,我的模擬是這樣的:

$mock = Mockery::mock(ManagementService::class);
        $mock->shouldReceive('callApi')
             ->once()
             ->andReturn('none');

謝謝大家

暫無
暫無

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

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