mock_objects_documentation.html.svn-base
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 779 行 · 第 1/3 页
SVN-BASE
779 行
</tr> </tbody></table> O霉 les param猫tres sont... <dl> <dt class="new_code">$method</dt> <dd>Le nom de la m茅thode, sous la forme d'une cha卯ne, 脿 laquelle la condition doit 锚tre appliqu茅e.</dd> <dt class="new_code">$args</dt> <dd> Les arguments sous la forme d'une liste. Les jokers peuvent 锚tre inclus de la m锚me mani猫re qu'avec <span class="new_code">setReturn()</span>. Cet argument est optionnel pour <span class="new_code">expectOnce()</span> et <span class="new_code">expectAtLeastOnce()</span>. </dd> <dt class="new_code">$timing</dt> <dd> Le seul point dans le temps pour tester la condition. Le premier appel commence 脿 z茅ro. </dd> <dt class="new_code">$count</dt> <dd>Le nombre d'appels attendu.</dd> </dl> La m茅thode <span class="new_code">expectMaximumCallCount()</span> est l茅g猫rement diff茅rente dans le sens o霉 elle ne pourra g茅n茅rer qu'un 茅chec. Elle reste silencieuse si la limite n'est jamais atteinte. </p> <p> Par ailleurs si vous avez just un appel dans votre test, v茅rifiez bien que vous utiliser <span class="new_code">expectOnce</span>.<br> Utiliser <span class="new_code">$mocked->expectAt(0, 'method', 'args);</span> tout seul ne sera pas pris en compte : la v茅rification des arguments et le comptage total sont pour l'instant encore ind茅pendant. </p> <p> Comme avec les assertions dans les sc茅narios de test, toutes ces attentes peuvent accepter une surcharge de message sous la forme d'un param猫tre suppl茅mentaire. Par ailleurs le message d'茅chec original peut 锚tre inclus dans le r茅sultat avec "%s". </p> <p><a class="target" name="approches"><h2>D'autres approches</h2></a></p> <p> Il existe trois approches pour cr茅er des objets fantaisie en comprenant celle utilis茅e par SimpleTest. Les coder 脿 la main en utilisant une classe de base, les g茅n茅rer dans un fichier ou les g茅n茅rer dynamiquement 脿 la vol茅e. </p> <p> Les objets fantaisie g茅n茅r茅s avec <a href="simple_test.html">SimpleTest</a> sont dynamiques. Ils sont cr茅茅s 脿 l'ex茅cution dans la m茅moire, gr芒ce 脿 <span class="new_code">eval()</span>, plut么t qu'茅crits dans un fichier. Cette op茅ration les rend facile 脿 cr茅er, en une seule ligne, surtout par rapport 脿 leur cr茅ation 脿 la main dans une hi茅rarchie de classe parall猫le. Le probl猫me avec ce comportement tient g茅n茅ralement dans la mise en place des tests proprement dits. Si les objets originaux changent les versions fantaisie sur lesquels reposent les tests, une d茅synchronisation peut subvenir. Cela peut aussi arriver avec l'approche en hi茅rarchie parall猫le, mais c'est d茅tect茅 beaucoup plus vite. </p> <p> Bien s没r, la solution est d'ajouter de v茅ritables tests d'int茅gration. Vous n'en avez pas besoin de beaucoup et le c么t茅 pratique des objets fantaisie fait plus que compenser la petite dose de test suppl茅mentaire. Vous ne pouvez pas avoir confiance dans du code qui ne serait test茅 que par des objets fantaisie. </p> <p> Si vous restez d茅termin茅 de construire des librairies statiques d'objets fantaisie parce que vous souhaitez 茅muler un comportement tr猫s sp茅cifique, vous pouvez y parvenir gr芒ce au g茅n茅rateur de classe de SimpleTest. Dans votre fichier librairie, par exemple <em>mocks/connection.php</em> pour une connexion 脿 une base de donn茅es, cr茅er un objet fantaisie et provoquer l'h茅ritage pour h茅riter pour surcharger des m茅thodes sp茅ciales ou ajouter des pr茅r茅glages...<pre><?php require_once('simpletest/mock_objects.php'); require_once('../classes/connection.php');<strong> Mock::generate('Connection', 'BasicMockConnection'); class MockConnection extends BasicMockConnection { function MockConnection(&$test, $wildcard = '*') { $this->BasicMockConnection($test, $wildcard); $this->setReturn('query', false); } }</strong>?></pre> L'appel <span class="new_code">generate</span> dit au g茅n茅rateur de classe d'en cr茅er une appel茅e <span class="new_code">BasicMockConnection</span> plut么t que la plus courante <span class="new_code">MockConnection</span>. Ensuite nous h茅ritons 脿 partir de celle-ci pour obtenir notre version de <span class="new_code">MockConnection</span>. En interceptant de cette mani猫re nous pouvons ajouter un comportement, ici transformer la valeur par d茅faut de <span class="new_code">query()</span> en "false". En utilisant le nom par d茅faut nous garantissons que le g茅n茅rateur de classe fantaisie n'en recr茅era pas une autre diff茅rente si il est invoqu茅 ailleurs dans les tests. Il ne cr茅era jamais de classe si elle existe d茅j脿. Aussi longtemps que le fichier ci-dessus est inclus avant alors tous les tests qui g茅n茅raient <span class="new_code">MockConnection</span> devraient utiliser notre version 脿 pr茅sent. Par contre si nous avons une erreur dans l'ordre et que la librairie de fantaisie en cr茅e une d'abord alors la cr茅ation de la classe 茅chouera tout simplement. </p> <p> Utiliser cette astuce si vous vous trouvez avec beaucoup de comportement en commun sur les objets fantaisie ou si vous avez de fr茅quents probl猫mes d'int茅gration plus tard dans les 茅tapes de test. </p> <p><a class="target" name="autres_testeurs"><h2>Je pense que SimpleTest pue !</h2></a></p> <p> Mais au moment d'茅crire ces lignes c'est le seul 脿 g茅rer les objets fantaisie, donc vous 锚tes bloqu茅 avec lui ? </p> <p> Non, pas du tout. <a href="simple_test.html">SimpleTest</a> est une bo卯te 脿 outils et parmi ceux-ci on trouve les objets fantaisie qui peuvent 锚tre utilis茅s ind茅pendamment. Supposons que vous avez votre propre testeur unitaire favori et que tous vos tests actuels l'utilisent. Pr茅tendez que vous avez appel茅 votre tester unitaire PHPUnit (c'est ce que tout le monde a fait) et que la classe principale de test ressemble 脿...<pre>class PHPUnit { function PHPUnit() { } function assertion($message, $assertion) { } ...}</pre> La seule chose que la m茅thode <span class="new_code">assertion()</span> r茅alise, c'est de pr茅parer une sortie embellie alors le param猫tre boolien de l'assertion sert 脿 d茅terminer s'il s'agit d'une erreur ou d'un succ猫s. Supposons qu'elle est utilis茅e de la mani猫re suivante...<pre>$unit_test = new PHPUnit();$unit_test>assertion('I hope this file exists', file_exists('my_file'));</pre> Comment utiliser les objets fantaisie avec ceci ? </p> <p> Il y a une m茅thode prot茅g茅e sur la classe de base des objets fantaisie : elle s'appelle <span class="new_code">_assertTrue()</span>. En surchargeant cette m茅thode nous pouvons utiliser notre propre format d'assertion. Nous commen莽ons avec une sous-classe, dans <em>my_mock.php</em>...<pre><strong><?php require_once('simpletest/mock_objects.php'); class MyMock extends SimpleMock() { function MyMock(&$test, $wildcard) { $this->SimpleMock($test, $wildcard); } function _assertTrue($assertion, $message) { $test = &$this->getTest(); $test->assertion($message, $assertion); } }?></strong></pre> Maintenant une instance de <span class="new_code">MyMock</span> cr茅era un objet qui parle le m锚me langage que votre testeur. Bien s没r le truc c'est que nous cr茅ons jamais un tel objet : le g茅n茅rateur s'en chargera. Nous avons juste besoin d'une ligne de code suppl茅mentaire pour dire au g茅n茅rateur d'utiliser vos nouveaux objets fantaisie...<pre><?php require_once('simpletst/mock_objects.php'); class MyMock extends SimpleMock() { function MyMock($test, $wildcard) { $this->SimpleMock(&$test, $wildcard); } function _assertTrue($assertion, $message , &$test) { $test->assertion($message, $assertion); } }<strong> SimpleTestOptions::setMockBaseClass('MyMock');</strong>?></pre> A partir de maintenant vous avez juste 脿 inclure <em>my_mock.php</em> 脿 la place de la version par d茅faut <em>simple_mock.php</em> et vous pouvez introduire des objets fantaisie dans votre suite de tests existants. </p> </div> References and related information... <ul><li> L'article originel sur <a href="http://www.mockobjects.com/">les objets fantaisie</a>. </li><li> La page du projet SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>. </li><li> La page d'accueil de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>. </li></ul><div class="menu_back"><div class="menu"><a href="index.html">SimpleTest</a> | <a href="overview.html">Overview</a> | <a href="unit_test_documentation.html">Unit tester</a> | <a href="group_test_documentation.html">Group tests</a> | <a href="mock_objects_documentation.html">Mock objects</a> | <a href="partial_mocks_documentation.html">Partial mocks</a> | <a href="reporter_documentation.html">Reporting</a> | <a href="expectation_documentation.html">Expectations</a> | <a href="web_tester_documentation.html">Web tester</a> | <a href="form_testing_documentation.html">Testing forms</a> | <a href="authentication_documentation.html">Authentication</a> | <a href="browser_documentation.html">Scriptable browser</a></div></div><div class="copyright"> Copyright<br>Marcus Baker 2006 </div></body></html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?