Estou tentando simular um método de atualização no PHPUnit, mas até agora shouldReceive('update')
não foi chamado.
PostServiceTest.php
public function test_can_update_a_post(): void
{
$mockedPostModel = Post::factory()->make();
$mockedTitle = 'Updated Title';
$mockedSlug = Str::slug($mockedTitle);
$mockedPostData = ['title' => $mockedTitle, 'slug' => $mockedSlug];
$updatedPostModel = Post::factory()->make($mockedPostData);
\Log::info($mockedPostModel);
\Log::info($updatedPostModel);
$postMock = Mockery::mock(Post::class);
$postMock->shouldReceive('findOrFail')->once()->with(1)->andReturn($mockedPostModel);
$postMock->shouldReceive('update')->once()->with($mockedPostData)->andReturn($updatedPostModel);
$postService = new AdminPostService($postMock);
$post = $postService->findOrFail(1);
\Log::info($post);
$post->update($mockedPostData);
\Log::info($post);
// $this->assertInstanceOf(Post::class, $post);
// $this->assertEquals($post->title, $mockedTitle);
// $this->assertEquals($post->slug, $mockedSlug);
}
Os registros
[2024-05-29 14:20:54] testing.INFO: {"title":"Otho Pfeffer","slug":"otho-pfeffer"}
[2024-05-29 14:20:54] testing.INFO: {"title":"Updated Title","slug":"updated-title"}
[2024-05-29 14:20:54] testing.INFO: {"title":"Otho Pfeffer","slug":"otho-pfeffer"}
[2024-05-29 14:20:54] testing.INFO: {"title":"Otho Pfeffer","slug":"otho-pfeffer"}
Meu resultado esperado deve ser a 4ª linha do log e deve corresponder à 2ª linha do log, pois é o resultado em$post->update($mockedPostData);
Doing $result = $post->update($mockedPostData);
retorna um valor nulo/em branco
Experimente o seguinte:
O modelo simulado
$postMock
é usado como parâmetroAdminPostService
e depois atribuído a$postService
. O que significa que todos os métodos simulados só podem ser acessados em$postService
. Atribua o resultado de$postService
a uma variável e use-o em suas asserções.