Méthode non sur l'objet fantaisie mise en œuvre d'une interface donnée dans PHPUnit?
Je suis nouveau sur les tests unitaires et de PHPUnit.
J'ai besoin d'une maquette, sur laquelle j'ai un contrôle total, la mise en œuvre de ConfigurationInterface
interface. Sujet de Test est ReportEventParamConverter
objet et le test se doit de vérifier l'interaction entre un objet et l'interface.
ReportEventParamConverter
objet (ici simplifié):
class ReportEventParamConverter implements ParamConverterInterface
{
/**
* @param Request $request
* @param ConfigurationInterface $configuration
*/
function apply(Request $request, ConfigurationInterface $configuration)
{
$request->attributes->set($configuration->getName(), $reportEvent);
}
/**
* @param ConfigurationInterface $configuration
* @return bool
*/
function supports(ConfigurationInterface $configuration)
{
return 'My\Namespaced\Class' === $configuration->getClass();
}
}
Et ce est la façon dont je suis en train d'essayer de se moquer de l'interface:
$cls = 'Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationInterface';
$mock = $this->getMock($mockCls);
J'ai besoin de simuler les valeurs renvoyées par deux méthodes: getClass()
et getName()
. Par exemple:
$mock->expects($this->any())
->method('getClass')
->will($this->returnValue('Some\Other\Class'))
;
Quand je crée un nouveau ReportEventParamConverter
et test supports()
méthode, j'ai le PHPUnit erreur:
Fatal error: Call to undefined method
Mock_ConfigurationInterface_21e9dccf::getClass().
$converter = new ReportEventParamConverter();
$this->assertFalse($converter->supports($mock));
- Le
ParamConverterInterface
a lagetClass()
méthode? - n'est-ce important?
- Veuillez répondre à la question d'ajouter plus d'informations à votre question. Qui aurait de l'importance. En dehors de cela, il serait ma première hypothèse pourquoi la maquette n'a pas cette fonction. De sorte que certains de base de débogage.
- non, il n'est pas. Et
getClass()
n'est jamais appelé sur unParamConverterInterface
instance. - Elle est invoquée dans le
supports()
méthode, n'est-ce pas? - invoquée dans le
supports()
méthode sur laConfigurationInterface
exemple, pas sur leParamConverterInterface
. Donc, il n'y a pas de méthodegetClass()
dansParamConverterInterface
et il ne devrait pas. - J'ai mélangé les noms d'interface, est
getClass()
dansConfigurationInterface
alors? Non, il n'est pas: github.com/sensio/SensioFrameworkExtraBundle/blob/master/... - de sorte qu'il n'existe pas. - non, il n'y en a pas. Apparemment, la méthode devrait être là (comme par de la documentation: symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/...)...
- Comme il n'existe pas, je suppose (je n'ai pas vérifié la maquette du code de bibliothèque) la maquette ne pas ajouter un talon de méthode pour cela. Comme elle est appelée (par
supports()
, PHP va jeter l'erreur fatale que la fonction n'existe pas dans la stub. - merci pour votre aide, c'était la méthode manquante alors.
Vous devez vous connecter pour publier un commentaire.
C'est parce qu'il n'y a pas de déclaration de "getClass" méthode ConfigurationInterface. La seule déclaration dans cette interface, c'est la méthode "getAliasName".
Tous vous avez besoin est à dire la maquette quelles méthodes vous seront stubing:
Avis qu'il n'y a pas de "getClass" déclaration, mais vous pouvez stub/se moquer de non-existence de méthode. À cet effet, vous pouvez en moquer:
Mais en outre vous avez besoin pour se moquer de "getAliasName" la méthode comme c'est à l'interface de la méthode ou de l'abstrait et il doit être "mis en œuvre". Ex.:
getMock()
appel? Si la méthode existe, alors il n'est pas nécessaire?Cyprien réponse m'a aidé, mais il y a une chasse aux sorcières à être conscient de. Vous pouvez vous moquer de classes qui n'existent pas, et PHPUnit ne me plaindrai pas. Donc, vous pourriez faire
Cela signifie que si
ConfigurationInterface
n'existe pas à ce point au cours de l'exécution, vous obtenez toujours un message commeSi vous êtes sûr que la méthode existe vraiment sur la classe, alors le problème probable est la classe elle-même n'existe pas (parce que vous n'avez pas besoin, ou que vous avez mal orthographié, etc).
L'OP est à l'aide d'un interface. Être conseillé que vous devez appeler
getMock
sans préciser la liste des méthodes de remplacement, ou si vous le faites, vous devez passerarray()
, ou de passer TOUS les noms de méthode, ou vous obtiendrez un message d'erreur semblable au suivant:require
d dans la classe sous test, mais qui n'est pas conforme à l'autochargeur.Tyler Collier de l'avertissement est juste, mais ne contient pas d'extrait de code sur la façon de contourner le problème. Remarque c'est très méchant, et vous devriez corriger l'interface à la place. Avec cet avertissement ajouté: