Estoy usando la última versión de PHPUnit (5.7.4). El problema es que cuando ejecuto la prueba, pasa. Pero si lo ejecuto una vez más, falla con el siguiente error:
ArgumentCountError: Too few arguments to function ValidationTest::testValidateType(), 0 passed and at least 3 expected
Si realizo algún cambio en la función del proveedor de datos (es decir, cambio los datos que se devolverán, el nombre o tipo de la función del proveedor, etc.) y vuelvo a ejecutar, pasa por una vez y falla con el error anterior para todas las pruebas consecutivas.
No estoy seguro, pero ¿PHPUnit utiliza algún mecanismo de almacenamiento en caché para almacenar en caché los datos del proveedor? Si es así, ¿hay alguna forma de limpiarlo (tal vez usando setUp
o tearDown
)?
El siguiente código funciona una vez (pasar una vez):
/**
* <strong i="15">@covers</strong> Validation
* <strong i="16">@coversDefaultClass</strong> Validation
*/
class ValidationTest extends TestCase {
protected $validation;
protected function setUp() {
$this->validation = new Validation();
}
/**
* <strong i="17">@covers</strong> ::validateType
* <strong i="18">@dataProvider</strong> validateTypeProdiver
*/
public function testValidateType($assertion, $argument, $type) {
$result = $this->validation->validateType($argument, $type);
switch ($assertion) {
case 'True':
$this->assertTrue($result);
break;
}
}
public function validateTypeProdiver() {
return [
['True', 'file.txt', 'str']
];
}
}
El siguiente código siempre funciona (pasa cada vez):
/**
* <strong i="24">@covers</strong> Validation
* <strong i="25">@coversDefaultClass</strong> Validation
*/
class ValidationTest extends TestCase {
protected $validation;
protected function setUp() {
$this->validation = new Validation();
}
/**
* <strong i="26">@covers</strong> ::validateType
*/
public function testValidateType() {
foreach ($this->validateTypeProdiver() as $args) {
$result = call_user_func_array([$this->validation, 'validateType'], array_slice($args, 1));
switch ($args[0]) {
case 'True':
$this->assertTrue($result);
break;
}
}
}
public function validateTypeProdiver() {
return [
['True', 'file.txt', 'str']
];
}
}
No puedo reproducir el problema con la información que proporcionaste. Esto es lo que hice:
$ composer require phpunit/phpunit:5.7.4
$ vendor/bin/phpunit && vendor/bin/phpunit
$ vendor/bin/phpunit && vendor/bin/phpunit
PHPUnit 5.7.4 by Sebastian Bergmann and contributors.
Runtime: PHP 7.0.17-2+deb.sury.org~trusty+1
Configuration: /.../phpunit.xml
. 1 / 1 (100%)
Time: 44 ms, Memory: 4.00MB
OK (1 test, 1 assertion)
PHPUnit 5.7.4 by Sebastian Bergmann and contributors.
Runtime: PHP 7.0.17-2+deb.sury.org~trusty+1
Configuration: /.../phpunit.xml
. 1 / 1 (100%)
Time: 32 ms, Memory: 4.00MB
OK (1 test, 1 assertion)
Esta es la clase de prueba que utilicé:
use PHPUnit\Framework\TestCase;
class TestMeTest extends TestCase
{
protected $validation;
protected function setUp()
{
$this->validation = new Validation();
}
/**
* <strong i="9">@covers</strong> ::validateType
* <strong i="10">@dataProvider</strong> validateTypeProdiver
*/
public function testValidateType($assertion, $argument, $type)
{
$result = $this->validation->validateType($argument, $type);
switch ($assertion) {
case 'True':
$this->assertTrue($result);
break;
}
}
public function validateTypeProdiver()
{
return [
['True', 'file.txt', 'str']
];
}
}
Y la clase Validation
:
class Validation
{
public function validateType() {
return true;
}
}
PHPUnit no almacena en caché los proveedores de datos de forma persistente.
Tampoco puedo reproducir esto.
Si alguien encontró este problema.
Tuve esta prueba
class Test extends TestCase {
protected $tested;
public function __construct()
{
parent::__construct();
$this->tested = new TestedClass();
}
public function provider(): array
{
return array(
array(0, 1, 1),
array(1, 2, 3),
);
}
/**
* <strong i="7">@dataProvider</strong> provider
*/
public function testSum(int $first, int $second, int $expected)
{
$this->assertEquals($expected, $this->tested->sum($first + $second));
}
}
Cambié __construct a setUp y funciona.
La solución de @dmirogin me alegró el día, phpunit 8.5
Comentario más útil
Si alguien encontró este problema.
Tuve esta prueba
Cambié __construct a setUp y funciona.