Qual é a diferença entre stop e mock?
sobes.tech IA
Resposta da IA
stop — é uma técnica de isolamento do teste de dependências diretas (por exemplo, chamadas a APIs externas, bases de dados) substituindo objetos reais por simulacros de teste. É usado para controlar o comportamento das dependências externas e garantir a reprodutibilidade dos testes.
mock (derivado de "objeto simulado") — é uma variedade de simulacro de teste que não apenas substitui o objeto real, mas também permite verificar como o código testado interage com ele. Com mocks, pode-se afirmar (assert) sobre as chamadas de métodos, seus argumentos e o número de chamadas.
Assim, stop é um conceito mais geral que descreve o isolamento, e mock é uma ferramenta concreta para alcançá-lo, adicionando a possibilidade de verificar a interação.
Exemplo usando PHPUnit e Mockery:
<?php
use PHPUnit\Framework\TestCase;
use Mockery;
// Classe que usa uma dependência externa
class UserProcessor
{
private $apiClient;
public function __construct(ApiClient $apiClient)
{
$this->apiClient = $apiClient;
}
public function processUserData(int $userId): bool
{
$data = $this->apiClient->fetchUserData($userId);
if ($data && $data['status'] === 'active') {
// Lógica para processar usuário ativo
return true;
}
return false;
}
}
// Exemplo de uso de mock para testes
class UserProcessorTest extends TestCase
{
public function testProcessUserDataWithActiveUser()
{
// Criar mock para ApiClient
$apiClientMock = Mockery::mock(ApiClient::class);
// Configurar comportamento esperado para o mock
// Esperar chamada ao método fetchUserData com argumento 123
$apiClientMock->shouldReceive('fetchUserData')
->with(123)
->andReturn(['status' => 'active', 'data' => '...']) // O mock retorna esses dados
->once(); // Esperamos que o método seja chamado exatamente uma vez
// Criar objeto de teste, passando o mock
$userProcessor = new UserProcessor($apiClientMock);
// Executar método de teste
$result = $userProcessor->processUserData(123);
// Verificar resultado
$this->assertTrue($result);
// Verificar se todas as expectativas do mock foram atendidas
Mockery::close();
}
}
Neste exemplo, ApiClient é substituído por um "mock". Nós "falsificamos" a chamada real à API e configuramos o mock para retornar certos dados ao chamar fetchUserData(123). Também verificamos se esse método foi chamado com os argumentos corretos e uma vez. Essa é a principal diferença: o mock permite verificar a interação.