Sobes.tech
Middle

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.