Avoir un constructeur dans votre test provoque la rupture de l'annotation dataProvider avec une erreur sur les arguments manquants :
PHPUnit 3.6.12 by Sebastian Bergmann.
...E
Time: 0 seconds, Memory: 3.25Mb
There was 1 error:
1) Test::testTheProvider
Missing argument 1 for Test::testTheProvider()
/home/nick/development/PHP-1.php:43
FAILURES!
Tests: 4, Assertions: 5, Errors: 1.
La suppression du constructeur fait que testTheProvider fonctionne à nouveau et ne semble pas casser les annotations @depends .
<?php
class Test extends PHPUnit_Framework_TestCase {
public function __construct() {
parent::__construct();
}
public function testEmpty() {
$stack = array();
$this->assertEmpty($stack);
return $stack;
}
/**
* <strong i="10">@depends</strong> testEmpty
*/
public function testPush(array $stack) {
array_push($stack, 'foo');
$this->assertEquals('foo', $stack[count($stack)-1]);
$this->assertNotEmpty($stack);
return $stack;
}
/**
* <strong i="11">@depends</strong> testPush
*/
public function testPop(array $stack) {
$this->assertEquals('foo', array_pop($stack));
$this->assertEmpty($stack);
}
public function theProvider() {
return array(
array(true, false)
);
}
/**
* <strong i="12">@dataProvider</strong> theProvider
*/
public function testTheProvider($var1, $var2) {
//$var1 = true;
//$var2 = false;
$this->assertNotEquals($var1, $var2);
}
}
?>
Comportement attendu. Si vous remplacez PHPUnit_Framework_TestCase::__construct()
(ce que vous ne devriez pas faire), votre implémentation doit accepter tous les arguments de l'implémentation d'origine et les transmettre à parent::__construct()
.
Merci pour la clarification. Cependant, le constructeur de PHPUnit_Framework_TestCase fournit des valeurs par défaut pour ses arguments et ils sont de toute façon définis de la même manière. L'appeler ne devrait faire aucune différence à moins que vous ne vouliez spécifiquement changer quelque chose.
De plus, cela n'est pas mentionné dans la documentation (http://www.phpunit.de/manual/current/en/extending-phpunit.html#extending-phpunit.PHPUnit_Framework_TestCase) et l'exemple DBUnit BankAccount le fait même (https:/ /github.com/sebastianbergmann/dbunit/blob/master/Samples/BankAccountDB/BankAccountDBTest.php#L60).
Je ne dirais pas que c'était un comportement attendu si certaines annotations fonctionnent et d'autres pas uniquement à cause de cela.
J'ai résolu le problème comme ceci:
la classe Test étend PHPUnit_Framework_TestCase {
fonction publique __construct($name = NULL, array $data = array(), $dataName = '') {
parent ::__construct($name, $data, $dataName);
}
}
Salut,
J'ai eu la chance de trouver cette réponse, j'ai gagné beaucoup de temps. Ty, @foued611
Mon cas est comme ça et il échoue.
# my base test class
use PHPUnit_Framework_TestCase;
class mytest extends PHPUnit_Framework_TestCase {
public function __construct() {
# do some common stuff to my tests...
}
}
class IntegrationTest extends mytest {
public function __construct() {
parent::__construct();
}
/**
* <strong i="9">@dataProvider</strong> additionProvider
*/
public function testAdd($a, $b, $expected)
{
$this->assertEquals($expected, $a + $b);
}
public function additionProvider()
{
return [
'adding zeros' => [0, 0, 0],
'zero plus one' => [0, 1, 1],
'one plus zero' => [1, 0, 1],
'one plus one' => [1, 1, 3]
];
}
}
la version fixe et fonctionnelle ressemble à ceci
# my base test class
use PHPUnit_Framework_TestCase;
class mytest extends PHPUnit_Framework_TestCase {
public function __construct() {
# do some common stuff to my tests...
parent::__construct(...func_get_args());
}
}
class IntegrationTest extends mytest {
public function __construct($name = NULL, array $data = array(), $dataName = '') {
parent::__construct(...func_get_args());
}
/**
* <strong i="13">@dataProvider</strong> additionProvider
*/
public function testAdd($a, $b, $expected)
{
$this->assertEquals($expected, $a + $b);
}
public function additionProvider()
{
return [
'adding zeros' => [0, 0, 0],
'zero plus one' => [0, 1, 1],
'one plus zero' => [1, 0, 1],
'one plus one' => [1, 1, 3]
];
}
}
La documentation actuelle de PHPUnit n'avertit en aucun cas de ne pas ajouter de __constructor() personnalisé pour vos classes de tests qui utilisent dataProvider. Ces informations pourraient être ajoutées à la documentation actuelle des fournisseurs de données, au moins cela vous donnerait une indication de la raison pour laquelle votre implémentation ne fonctionne pas même si vous copiez-collez l'exemple de code dataProvider.
Et si vous avez besoin d'utiliser un __constructor personnalisé, ajoutez un guide sur la manière de le faire fonctionner.
Ping car fermé @sebastianbergmann
Commentaire le plus utile
J'ai résolu le problème comme ceci:
la classe Test étend PHPUnit_Framework_TestCase {
fonction publique __construct($name = NULL, array $data = array(), $dataName = '') {
parent ::__construct($name, $data, $dataName);
}
}