Sobes.tech
Middle

¿En qué consiste la diferencia entre stop y mock?

sobes.tech AI

Respuesta de la IA

stop — es una técnica de aislamiento de la prueba de dependencias directas (por ejemplo, llamadas a API externas, bases de datos) mediante la sustitución de objetos reales por simulaciones de prueba. Se utiliza para controlar el comportamiento de las dependencias externas y garantizar la reproducibilidad de las pruebas.

mock (derivado de "objeto simulado") — es una variedad de simulación de prueba que no solo reemplaza el objeto real, sino que también permite verificar cómo interactúa el código probado con él. Con los mocks, se puede afirmar (assert) sobre las llamadas a métodos, sus argumentos y la cantidad de llamadas.

Por lo tanto, stop es un concepto más general que describe el aislamiento, y mock es una herramienta concreta para lograrlo, añadiendo la posibilidad de verificar la interacción.

Ejemplo usando PHPUnit y Mockery:

<?php

use PHPUnit\Framework\TestCase;
use Mockery;

// Clase que usa una dependencia 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 procesar usuario activo
            return true;
        }
        return false;
    }
}

// Ejemplo de uso de mock para pruebas
class UserProcessorTest extends TestCase
{
    public function testProcessUserDataWithActiveUser()
    {
        // Crear mock para ApiClient
        $apiClientMock = Mockery::mock(ApiClient::class);

        // Configurar comportamiento esperado para el mock
        // Esperar llamada al método fetchUserData con argumento 123
        $apiClientMock->shouldReceive('fetchUserData')
                      ->with(123)
                      ->andReturn(['status' => 'active', 'data' => '...']) // El mock devuelve estos datos
                      ->once(); // Esperamos que el método sea llamado exactamente una vez

        // Crear objeto de prueba, pasándole el mock
        $userProcessor = new UserProcessor($apiClientMock);

        // Ejecutar método probado
        $result = $userProcessor->processUserData(123);

        // Verificar resultado
        $this->assertTrue($result);

        // Verificar que todas las expectativas del mock se hayan cumplido
        Mockery::close();
    }
}

En este ejemplo, ApiClient se reemplaza por un "mock". Hemos "suplantado" la llamada real a la API y configurado el mock para devolver ciertos datos al llamar a fetchUserData(123). También verificamos que este método fue llamado con los argumentos correctos y una vez. Esa es la diferencia clave: el mock permite verificar la interacción.