Ich verwende die neueste Version von PHPUnit (5.7.4). Das Problem ist, wenn ich den Test durchführe, besteht er. Aber wenn ich es noch einmal ausführe, schlägt es mit folgendem Fehler fehl:
ArgumentCountError: Too few arguments to function ValidationTest::testValidateType(), 0 passed and at least 3 expected
Wenn ich Änderungen an der Datenproviderfunktion vornehme (dh die zurückzugebenden Daten, Name oder Typ der Providerfunktion usw. ändere) und erneut starte, wird sie einmal erfolgreich ausgeführt und schlägt bei allen nachfolgenden Testläufen mit dem obigen Fehler fehl.
Nicht sicher, aber verwendet PHPUnit einen Caching-Mechanismus, um Anbieterdaten zwischenzuspeichern? Wenn ja, gibt es eine Möglichkeit, es zu reinigen (vielleicht mit setUp
oder tearDown
)?
Der folgende Code funktioniert einmal (einmal übergeben):
/**
* <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']
];
}
}
Der folgende Code funktioniert immer (passiert jedes Mal):
/**
* <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']
];
}
}
Ich kann das Problem mit Ihren Angaben nicht reproduzieren. Folgendes habe ich getan:
$ 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)
Dies ist die Testklasse, die ich verwendet habe:
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']
];
}
}
Und die Klasse Validation
:
class Validation
{
public function validateType() {
return true;
}
}
PHPUnit speichert Datenprovider nicht dauerhaft zwischen.
Auch das kann ich nicht reproduzieren.
Wenn jemand irgendwann auf dieses Problem gestoßen ist.
Ich hatte diesen Test
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));
}
}
Ich habe __construct in setUp geändert und es funktioniert.
Die Lösung von @dmirogin hat meinen Tag gemacht, phpunit 8.5
Hilfreichster Kommentar
Wenn jemand irgendwann auf dieses Problem gestoßen ist.
Ich hatte diesen Test
Ich habe __construct in setUp geändert und es funktioniert.