[英]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.