If you liked what you've learned so far, dive in!
Subscribe to get access to this tutorial plus
video, code and script downloads.
With a Subscription, click any sentence in the script to jump to that part of the video!
Login SubscribeTratamos nuestro código fuente como un ciudadano de primera clase. Eso significa, entre otras cosas, que evitamos la duplicación. ¿Por qué no hacer lo mismo con nuestras pruebas? Nuestras tres pruebas para el tamaño son... repetitivas. Prueban lo mismo sólo que con una entrada ligeramente diferente y una afirmación distinta. ¿Hay alguna forma de mejorar esto? Absolutamente: gracias a los Proveedores de Datos de PHPUnit.
Desplázate al final de DinosaurTest
y añadepublic function sizeDescriptionProvider()
. Dentro, yield
un array con [10, 'Large']
, luego yield [5,
'Medium'], y finalmente yield [4, 'Small']
. Yield no es más que una forma elegante de devolver arrays utilizando la función Generador incorporada de PHP. Como verás en un minuto, estos valores -como 10
y large
- se convertirán en argumentos de nuestra prueba.
Muy bien, arriba en nuestro método de prueba, añade un argumento int $length
y luegostring $expectedSize
. Ahora, en lugar de que la longitud de Big Eaty sea 10
, utiliza$length
. Y para nuestra afirmación, utiliza $expectedSize
en lugar de Large
. Ya no necesitamos las pruebas mediana y pequeña, así que podemos eliminarlas.
De acuerdo Vuelve a tu terminal y ejecuta nuestras pruebas:
./vendor/bin/phpunit --testdox
Uh oh... ¡Nuestra prueba está fallando porque! Dice:
ArgumentCountError - Se han proporcionado muy pocos argumentos. se han pasado 0 y se esperan exactamente 2.
Oops, nunca le dijimos a nuestro método de prueba que utilizara el proveedor de datos. Vuelve a nuestro test y añade un DocBlock con @dataProvider sizeDescriptionProvider
. Cuando se publique PHPUnit 10, podremos utilizar un elegante atributo #[DataProvider]
en lugar de esta anotación.
¡Vuelve al terminal! Ejecuta de nuevo las pruebas:
./vendor/bin/phpunit --testdox
Y... ¡Sí! ¡Nuestras pruebas pasan!
En la salida, vemos que cada prueba se ejecutó con los conjuntos de datos 0, 1 y 2. Son las matrices del proveedor de datos. Podemos arreglar esto un poco... porque no va a ser muy útil después si PHPUnit nos dice que el conjunto de datos 2
ha fallado. ¿Cuál es ese?
Vuelve a nuestra prueba y, aquí abajo, después de la primera sentencia yield
, añade la clave de mensaje '10 Meter Large Dino' =>
. Copia y pega esto para nuestro dino mediano con 5
en lugar de 10
y esto tiene que ser Medium
. Haz lo mismo para nuestro dino pequeño con 4
y Small
.
De vuelta a nuestro terminal, veamos ahora nuestras pruebas:
./vendor/bin/phpunit --testdox
Y... ¡Genial los frijoles! Ahora tenemos
El dino de 10 metros o más es grande con Dino grande de 10 metros
Esto tiene mucho mejor aspecto que ver el conjunto de datos 0... aunque tenemos que arreglar una cosa más. El nombre del método de prueba ya no tiene sentido. Cámbialo por testDinoHasCorrectSizeDescriptionFromLength()
.
Y, mirando nuestra afirmación, el argumento del mensaje ya no es muy útil... así que eliminémoslo.
Por último, aunque no es necesario... Podemos utilizar array
o\Generator
como tipo de retorno del proveedor de datos. Optemos por\Generator
; al fin y al cabo, puede que algún día los necesitemos para las vallas del parque...
Para asegurarnos de que esto no rompe nada, prueba las pruebas una vez más:
./vendor/bin/phpunit --testdox
Ummm... ¡Impresionante! ¡Cheques verdes por todas partes!
Y ahí lo tienes, con un poco de cariño, nuestras pruebas están ahora bien ordenadas... A continuación, vamos a averiguar cómo podemos obtener el estado de salud de nuestro Dino desde GitHub y utilizarlo en nuestra aplicación...
Hey Lechu,
I think PHPUnit does not support PHP attributes yet, you need to use annotations instead
Cheers!
Howdy! Thanks for pointing that out to us. It does indeed seam slightly off. We'll look into it and see what we can come up with.
// composer.json
{
"require": {
"php": ">=8.1.0",
"ext-ctype": "*",
"ext-iconv": "*",
"symfony/asset": "6.1.*", // v6.1.0
"symfony/console": "6.1.*", // v6.1.4
"symfony/dotenv": "6.1.*", // v6.1.0
"symfony/flex": "^2", // v2.2.3
"symfony/framework-bundle": "6.1.*", // v6.1.4
"symfony/http-client": "6.1.*", // v6.1.4
"symfony/runtime": "6.1.*", // v6.1.3
"symfony/twig-bundle": "6.1.*", // v6.1.1
"symfony/yaml": "6.1.*" // v6.1.4
},
"require-dev": {
"phpunit/phpunit": "^9.5", // 9.5.23
"symfony/browser-kit": "6.1.*", // v6.1.3
"symfony/css-selector": "6.1.*", // v6.1.3
"symfony/phpunit-bridge": "^6.1" // v6.1.3
}
}
Data provider attributes, doesn't work :/
When I use: #[DataProvider('sizeDescriptionProvider')]
PhpStorm shows me "Undefined class 'DataProvider'" :)