A rota definida em web.php
é
Route::get('about-us', [PageController::class, 'renderAboutUsPage'])->name('pages.about-us');
No meu controlador, tenho métodos
class PageController extends Controller
{
protected $pageService;
/**
* Class contructor
*/
public function __construct(PageService $pageService)
{
$this->pageService = $pageService;
}
/**
* Method to render about us page
*/
public function renderAboutUsPage(){
return $this->renderStaticPage('about-us');
}
/**
* Method to render static page
* @param slug
*/
private function renderStaticPage($slug) {
Log::info("Rendering ".$slug." static page.");
$page = $this->pageService->getActivePageBySlug($slug);
return view('pages.static-page', ['data'=>$page]);
}
}
O que meu entendimento diz quando testo o método renderAboutUsPage()
é que devo simular pageService->getActivePageBySlug($slug)
no meu teste para que uma chamada real para esse método possa ser evitada. Isso ajudará a reduzir o tempo de execução do teste.
Tenho testes separados para meu serviço, nos quais estou testando getActivePageBySlug()
de forma independente.
Meu caso de teste é
/**
* @test
* @testdox Whether the about us page returns a successful response, renders the correct view, contains view object {data} and log correct messages in log file.
* @group website
* @group static-pages
*/
public function test_whether_about_us_page_renders_successfully()
{
Log::shouldReceive('info')->once()->with("Rendering about-us static page.");
Log::shouldReceive('info')->once()->with("Getting page by active status and provided slug.");
$response = $this->get('about-us');
$response->assertStatus(200);
$response->assertViewIs('pages.static-page');
$response->assertViewHas('data');
}
Não sei como simular o método getActivePageBySlug($slug)
no meu caso de teste para evitar chamadas reais.
A definição de getActivePageBySlug($slug)
método é:
/**
* Method to get page by slug (Checks to page status is active)
* @param string slug
* @return Page page
* @throws Throwable e
*/
public function getActivePageBySlug(string $slug)
{
Log::info("Getting page by active status and provided slug.");
try
{
$page = Page::where('slug',$slug)->where('status', Status::active->value())->first();
if(!$page) {
throw new NotFoundHttpException("The page ". $slug ." not found.");
}
return $page;
}
catch (Throwable $e)
{
Log::error("Error in getting page by slug.");
throw $e;
}
}
Na realidade, você não quer evitar a chamada, senão não é realmente um teste de funcionalidade, mas um "teste unitário". E se você estiver testando um endpoint/url em seu projeto, deve ser um teste de funcionalidade, você deve fazer a chamada real, a menos que seja um serviço de terceiros onde você realmente queira evitar a chamada.
Seu serviço está fazendo uma chamada de banco de dados, você deve chamá-lo, está tudo bem, principalmente se você não estiver fazendo nenhum trabalho pesado depois disso.
Então, se você quiser fazer a chamada real, você deve ter o código assim (supondo que você tenha fábricas e tudo configurado corretamente):
Esse deve ser o teste mais simples de todos, você pode adicionar mais coisas lá. Veja que eu mudei o nome do teste (tentando seguir os padrões), e outras pequenas mudanças.
Agora, digamos que você também espera que a página falhe (seu serviço gere um erro), então vamos testar isso também:
Agora, você pode ver que estamos, antes de tudo, dependendo do primeiro teste, se o caminho feliz funcionar, esse novo caso também pode ser executado. Também estamos aproveitando os provedores de dados , então testamos diferentes possibilidades com o mesmo caso, apenas inicialização de dados diferente.
Não me lembro agora qual é a afirmação correta para verificar também o erro do endpoint, então também nos certificamos de verificar se o erro é o esperado, mas, por favor, leia a documentação oficial e mexa nela, e você o encontrará.
Por fim, se você realmente deseja evitar fazer qualquer chamada, este deve ser seu teste:
Você quer zombar do serviço, então pode fazer qualquer coisa.
Tenha em mente que usei a documentação do Laravel 11.x e não tenho ideia de qual conteúdo você
Page
tem. Você também deve garantir que o conteúdo retornado é o esperado, não apenas que ele temdata
índice na sua visualização, mas também quais dados são.