2010-11-25 3 views
5

Est-il possible de simuler un objet de manière à fausser plusieurs implémentations d'interfaces? (Note: J'utilise « la moquerie de Padraic » https://github.com/padraic/mockery)Se moquer de plusieurs interfaces

Supposons que j'ai une classe Mysql, qui met en œuvre Db_Interface et Configurable_Interface, et que je besoin de se moquer juste pour être en mesure de tester une autre classe. Je veux créer un pseudo avec un autre nom, pas Mysql (parce qu'il pourrait changer ou disparaître dans le futur, c'est pourquoi nous utilisons des interfaces, non?), Donc je ne veux pas faire Mockery :: mock ('Mysql') . Je sais que je pourrais le créer comme Mockery :: mock ('Db_Interface') et ça passerait le contrôle instanceof Db_Interface. Mais comment puis-je faire passer la vérification de l'autre interface aussi?

@Gordon ok Heres le code:

$m = Mockery::mock('Configurable_Interface'); 
var_dump($m instanceof Configurable_Interface); // true 
var_dump($m instanceof Db_Interface); // false of course, since I don't know how to make a mock implement 2 interfaces 
+0

Comment est le type de la dépendance appliquée dans le TestSubject? – Gordon

+0

Je ne peux pas faire que var_dump ($ my_mock instanceof Db_Interface) imprime 'true'. C'est tout ce dont j'ai besoin – HappyDeveloper

+0

@Happy pouvez-vous s'il vous plaît montrer du code. – Gordon

Répondre

19

Pour quiconque trébuche dans ce domaine. Dans Mockery, vous pouvez appeler Mockery::mock('firstInterface, secondInterface'); pour simuler un objet qui doit implémenter plusieurs interfaces.

Source: Mockery README

+7

A eu un peu de problème avec cela, assurez-vous que l'argument que vous transmettez est ONE WHOLE STRING ('Mockery :: mock ('interface, interface2''), et non deux chaînes (' Mockery :: mock (' interface ' , 'interface2'') Juste au cas où vous ne pouvez pas comprendre pourquoi cela ne fonctionne pas aussi bien – Nikko

+4

J'ai testé cela avec Mockery 0.9.4 et la notation avec deux chaînes séparées a fonctionné pour moi ('Mockery :: mock (' interface ',' interface2'') – aimfeld

0

vous avez besoin d'un bout. créer une classe qui implémente les 2 interfaces. toutes les méthodes avec "return null". que de créer une maquette avec ce talon.

3

$this->getMockBuilder(['A', 'B'])->getMock();

+0

Puis-je vous demander d'ajouter un peu de contexte autour de votre réponse.Les réponses au code seulement sont difficiles à comprendre.Il aidera le demandeur et les futurs lecteurs à la fois si vous pouvez ajouter plus d'informations dans votre message – RBT

+0

@RBT OP a demandé comment simuler plusieurs interfaces avec PHPUnit et le code ci-dessus montre comment le faire. –

Questions connexes