Expectativas en Pest

Pest proporciona una API de expectations o expectativas. Una API limpia, declarativa y extensible para hacer verificaciones.

Inicializamos la API de expectativas al declarar el helper expect(). Y le pasamos un valor a verificar, expect($value).

Por ejemplo, para comprobar que true es verdadero, usamos la expectativa toBeTrue().

<?php

test('application', function () {
    expect(true)->toBeTrue();
});

Expectativas disponibles

Supongamos que queremos validar los valores de un usuario.

Para comprobar que el nombre del usuario sea un string toBeString(). Y que no sea un valor vacío not->toBeEmpty(). Anteponemos la propiedad not para decirle a la API que queremos lo opuesto a la expectativa.

<?php

test('valid name', function () {
	$user = App\Models\User::factory()->create();

	expect($user->name)->toBeString()->not->toBeEmpty();
});

toContain('@') para verificar que el email del usuario sea un email válido, podemos esperar que contenga el símbolo @.

<?php

test('valid email', function () {
	$user = App\Models\User::factory()->create();

	expect($user->email)->toBeString()->toContain('@');
});

toStartWith('+') para verificar que el teléfono del usuario sea un teléfono válido, podemos esperar que comience con el símbolo + para números internacionales.

<?php

test('valid phone', function () {
	$user = App\Models\User::factory()->create();

	expect($user->phone)->toBeString()->toStartWith('+');
});

toBe('admin') para verificar que el valor sea exactamente uno establecido.

<?php

test('admin role', function () {
	$user = App\Models\User::factory()->create();

	expect($user->role)->toBe('admin');
});

toBeIn(['mx', 'us']) para verificar que el valor sea alguno de los establecidos.

<?php

test('valid country', function () {
	$user = App\Models\User::factory()->create();

	expect($user->country)->toBeIn(['mx', 'us']);
});

En la documentación de Pest se listan todas las expectativas que hay disponibles.


Expectativas personalizadas

Algunas veces nos gustaría tener expectativas personalizadas. Haciendo que nuestros tests sean más expresivos. Por ejemplo, una expectativa toBePhoneNumber(), en vez de toBeString()->toStartWith('+').

Pest nos permite hacerlo extendiendo la API de expectativas. Así, podemos añadir expectativas personalizadas que mejor se adapten al proyecto que estamos trabajando.

Editamos el archivo de configuración tests/Pest.php. Dentro de la sección "Expectativas" o "Expectations" comenzamos con un llamado a la funcion expect() sin ningua propiedad. Invocamos el método extend() y le pasamos el nombre del macro que vamos a crear, toBePhoneNumber. Añadimos un closure como segundo parámetro con la lógica para nuesta expectativa personalizada.

<?php

// tests/Pest.php

// ...

expect()->extend('toBePhoneNumber', function ($areaCode) {
	expect($this->value)->toBeString()->toStartWith('+');
});

Si hay alguna propiedad, como areaCode, que quisiéramos añadir a nuestra expectativa, podemos aceptarla en el closure.

<?php

// ...

expect()->extend('toBePhoneNumber', function ($areaCode) {
	// ...
});

Expectativas de orden superior

Con las expectativas de orden superior de Pest, podemos simplificar los test drásticamente al pasar simplemente el objecto principal al método expect.

Por ejemplo, pasar el objecto del usuario y realizar expectativas sobre las propiedades del objecto.

<?php

test('application', function () {
	expect(App\Models\User::factory()->create())
		->name->toBeString()->not->toBeEmpty()
		->email->toBeString()->toContain('@')
		->phone->toBePhoneNumber()
		->role->toBe('admin');
		->country->toBeIn(['mx', 'us']);
});

Haciendo esto, nos deja un test mucho más limpio y claro.