PHPUnit “Raillé méthode n'existe pas.” lors de l'utilisation de $maquette>attend($this->at(...))
J'ai couru dans un étrange problème avec PHPUnit les objets fantaisie. J'ai une méthode qui devrait être appelé deux fois, donc je suis en utilisant le "à" matcher. Cela fonctionne pour la première fois, la méthode est appelée, mais pour une raison quelconque, la deuxième fois il l'appelle, je reçois "Raillé méthode n'existe pas.". J'ai utilisé le "à" matcher avant et n'ai jamais couru dans cette.
Mon code ressemble à quelque chose comme:
class MyTest extends PHPUnit_Framework_TestCase
{
...
public function testThis()
{
$mock = $this->getMock('MyClass', array('exists', 'another_method', '...'));
$mock->expects($this->at(0))
->method('exists')
->with($this->equalTo('foo'))
->will($this->returnValue(true));
$mock->expects($this->at(1))
->method('exists')
->with($this->equalTo('bar'))
->will($this->returnValue(false));
}
...
}
Quand je lance le test, j'obtiens:
Expectation failed for method name is equal to <string:exists> when invoked at sequence index 1.
Mocked method does not exist.
Si je supprime le deuxième matcher, je n'ai pas l'erreur.
Quelqu'un a rencontré ce avant?
Merci!
Vous devez vous connecter pour publier un commentaire.
La question a fini par être avec la façon dont j'ai compris le "à" matcher au travail. Aussi, mon exemple n'était pas textuellement comment il est dans mon test de l'unité. Je pensais que le "à" matcher compteur travaillé sur une chaque requête, où il fonctionne vraiment par l'instance d'un objet de base.
Exemple:
Incorrect:
Correct:
$this->at()
doit commencer à partir de1
pas de0
.Pour info, Pas sûr si son lié, mais j'ai rencontré la même chose, mais pas avec la
$this->at()
méthode, pour moi, c'était la$this->never()
méthode.Cela a déclenché l'erreur
Cette correction de l'erreur
Il fait la même chose lors de l'utilisation de la
$this->exactly(0)
méthode.Espère que cela aide quelqu'un.
Essayez de changer
$this->at(1)
à$this->at(2)
foo
et 3 fois pourbar
méthodes après foo. Départbar
attente de 1 correction d'un problème.C'est une formulation malheureuse de la message d'erreur par PHPUnit.
Double chèque à l'ordre de vos appels, comme @rr réponse mentionne.
Pour moi, autant que je sais qu'avec mon propre code, je devrais être à l'aide de
at(0)
etat(1)
respectivement, mais il n'était pas jusqu'à ce que j'ai utiliséat(2)
etat(3)
plutôt qu'il a travaillé. (Je suis en utilisant session moqueur dans CakePHP.)La meilleure façon de vérifier l'ordre est d'obtenir " en " la méthode appelée et vérifier ce qui est passé. Vous pouvez le faire comme ceci:
Aussi loin que je peux dire à partir de la Démo de code, il devrait travail. J'ai produit un exemple de travail dans le cas où vous utilisez une ancienne Version de PHPUnit et que vous souhaitez vérifier de cette façon, si cela fonctionne pour vous aussi.
Dans le cas où cela ne fonctionne pas peut-être que vous pourriez fournir un peu plus (au mieux exécutable) code ? 🙂
impression
Êtes-vous sûr que vous avez inclus MyClass dans votre test? J'ai eu quelques erreurs de méthode non quand se moquant d'une classe/interface sans l'inclure.
Peut-être pas lorsque la question a été soulevée cependant, aujourd'hui la documentation précise clairement comment l'at doit être utilisé et je cite