J'essaie de tester si une méthode protégée est appelée dans une interface publique. Je sais que ça s'appelle correctement, mais PHPUnit dit son jamais appelé.Test si une méthode protégée a été appelée
La même chose se produit quand je teste l'inverse, lorsqu'une méthode est jamais appelé:
<?php
abstract class AnotherClassAbstract
{
abstract public foo();
public function doAnotherStuff()
{
$this->_loadCache();
}
protected function _loadCache();
{
// implementation is irrelevant
}
}
<?php
class MyTest extends PHPUnit_Framework_TestCase
{
public function testCalled()
{
$mock = $this->getMockForAbstractClass('AnotherClass');
$mock->expects($this->once())
->method('_loadCache');
$mock->doAnotherStuff();
}
}
La méthode est appelée, mais PHPUnit dit que ce n'est pas.
Qu'est-ce qui ne va pas?
Modifier Je n'étais pas déclarer mes méthodes avec des deux-points, il était juste pour dénoter qu'il était une méthode publique (interface). Mise à jour vers les déclarations de classe/méthodes complètes.
Edit 2 Je aurais dû dire que je suis tester certaines implémentations de méthode dans une classe abstraite (modifié le code pour en tenir compte). Puisque je ne peux pas instancier la classe, comment puis-je tester cela?
Je pense à créer un SomeClassSimple
en étendant SomeClassAbstract
et en testant celui-ci à la place. Est-ce la bonne approche?
Merci Ewan, vous avez raison.Bien sûr, si c'est un objet mock il n'a pas l'implémentation de la méthode. Comme je suis bête. Je vais marquer votre réponse comme correcte. Si vous le pouvez, s'il vous plaît, voir ma deuxième édition. –
Donc, ce que j'essaie de tester est la mise en œuvre, pas le comportement, non? C'est un peu plus clair pour moi, merci. –
Les tests unitaires sont, je pense, plus d'un art qu'il n'y paraît. Je l'ai apprécié plus après avoir lu les modèles de test xUnit: Refactoring Test Code par Gerard Meszaros. À son tour, le livre était une forte recommandation de Sebastian Bergmann, l'auteur de PHPUnit. –