Problème avec PHPUnit et les Fournisseurs de Données
J'ai le cas test suivant:
include_once('../Logger.php');
class LoggerTest extends PHPUnit_Framework_TestCase {
public function providerLogger() {
return new Logger;
}
/**
* @dataProvider providerLogger
*/
public function testAddStream($logger) {
$this->assertTrue(false);
}
}
Quand je le lance dans PHPUnit, j'obtiens:
PHPUnit 3.4.14 by Sebastian Bergmann.
..........
Time: 0 seconds, Memory: 5.75Mb
OK (1 tests, 0 assertions)
Test échoue, mais il ne le fait pas. J'ai essayé d'avoir:
public function providerLogger() {
return array(new Logger);
}
Mais j'obtiens:
The data provider specified for LoggerTest::testAddStream is invalid.
J'ai essayé de le déclarer static
(comme le manuel dit), mais toujours pas de différence.
Je me souviens d'avoir fonctionner dans un mode similaire avant, mais je peux me tromper. Ce qui me manque?
Merci d'avance pour votre aide.
PHPUnit 3.4.14 (prises de POIRE) sur PHP 5.3.3
- 1 des essais, 0 assertions. Votre test n'a même pas été appelé. Je parie que le problème n'est pas dans le fournisseur de données.
- Le fait est, si je supprime le @dataProvider chose, j'obtiens une erreur parce que testAddStream() nécessite un paramètre. Si je supprime le paramètre complètement, test échoue comme il se doit.
- Je rencontre un problème à l'aide de PHPUnit dans Zend Studio où si je m'inscrire à un espace de noms avec Zend_Autoloader, à l'aide de @dataProvider provoque la (tentative de) chargez le nom du test en tant que classe. Je vais jeter chances que ces 2 problèmes sont liés.
- Poster votre code sous forme de question et nous verrons bien! 😉
Vous devez vous connecter pour publier un commentaire.
Mise à jour mineure: C'est OK pour utiliser les méthodes d'instance en tant que fournisseur depuis la version 3.2 (ou quelque part autour de ça). Avoir un oeil sur les commentaires
Le fournisseur doit ressembler à ceci.
Tout d'abord: La méthode doit être statique si vous utilisez la version de phpunit inférieure à 3.3 .
La tableau s sont importantes. Il n'est pas difficile à comprendre. Que l'extérieur de la matrice a qu'une seule valeur pour chaque itération, le test doit être appelé. Ici le test juste appelé une fois. L'intérieur des tableaux sont les paramètres (dans l'ordre) le test est invoqué avec. Votre test attend exactement un paramètre, donc à l'intérieur des tableaux a toujours besoin d'exactement une valeur. Un autre petit exemple
Ici testAdd est exécuté 3 fois, une pour chaque seconde de niveau tableau, et elle recevra les valeurs à partir de l'intérieur tableau s. Vous pouvez remarquer que le test échoue et vous offre un message dans lequel itération du jeu de données (ici #3, parce que 5+5 n'est pas 6 ;)) l'échec de l'assertion.
static
, j'avais essayé de tableaux, j'avais aussi essayé des tableaux de tableaux (la solution réelle), mais je dois avoir fait quelque chose de mal, parce que cela fonctionne maintenant. Merci beaucoup!J'ai eu le même problème, et il a été résolu, quand j'ai supprimé le constructeur vide,qui a été généré automatiquement. Iam ne sais pas pourquoi cela résout le problème. J'ai aussi eu pas de test de la méthode de même nom que la classe. Le fournisseur de méthode n'a pas besoin d'être statique, jusqu'à présent, mon essai sans statique. Mais aussi quand je fais le fournisseur de la méthode statique
est l'ensemble complet de code
J'ai aussi constaté que vous ne pouvez pas directement de la chaîne de fournisseurs de données:
Apparemment, PHPUnit appelle tout le fournisseur de fonctions avant l'exécution des tests, de sorte que vous pouvez même pas utiliser une autre fournisseur de fonctions pour nourrir les données de résultat d'essai pour d'autres tests. Le meilleur que vous pouvez faire est de simuler:
Supprimer le paramètre de la fonction publique, testAddStream($logger) et essayez à nouveau. Je ne crois pas que PHPUnit va invoquer un test qui nécessite des paramètres, il est impossible de passer.
Voici, j'ai réalisé un patron pour réaliser le test de dépendances pour dataProviders! De cette façon, vous pouvez de la chaîne d'dataProviders.
Le 2ème jeu de données échoue 1 test pour illustrer.