mock_objects_documentation.html.svn-base
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 779 行 · 第 1/3 页
SVN-BASE
779 行
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Documentation SimpleTest : les objets fantaise</title><link rel="stylesheet" type="text/css" href="docs.css" title="Styles"></head><body><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><h1>Documentation sur les objets fantaisie</h1> This page... <ul><li> <a href="#quoi">Que sont les objets fantaisie ?</a> </li><li> <a href="#creation">Cr茅er des objets fantaisie</a>. </li><li> <a href="#bouchon">L'objet fantaisie - acteur</a> ou bouchon. </li><li> <a href="#attentes">L'objet fantaisie - critique</a> avec des attentes. </li><li> <a href="#approches">D'autres approches</a> y compris des librairies d'objets fantaisie. </li><li> Utiliser les objets fantaisie avec <a href="#autres_testeurs">d'autres testeurs unitaires</a>. </li></ul><div class="content"> <p><a class="target" name="quoi"><h2>Que sont les objets fantaisie ?</h2></a></p> <p> Les objets fantaisie - ou "mock objects" en anglais - ont deux r么les pendant un sc茅nario de test : acteur et critique. </p> <p> Le comportement d'acteur est celui de simuler des objets difficiles 脿 initialiser ou trop consommateurs en temps pendant un test. Le cas classique est celui de la connexion 脿 une base de donn茅es. Mettre sur pied une base de donn茅es de test au lancement de chaque test ralentirait consid茅rablement les tests et en plus exigerait l'installation d'un moteur de base de donn茅es ainsi que des donn茅es sur la machine de test. Si nous pouvons simuler la connexion et renvoyer des donn茅es 脿 notre guise alors non seulement nous gagnons en pragmatisme sur les tests mais en sus nous pouvons nourrir notre base avec des donn茅es falsifi茅es et voir comment il r茅pond. Nous pouvons simuler une base de donn茅es en suspens ou d'autres cas extr锚mes sans avoir 脿 cr茅er une v茅ritable panne de base de donn茅es. En d'autres termes nous pouvons gagner en contr么le sur l'environnement de test. </p> <p> Si les objets fantaisie ne se comportaient que comme des acteurs alors on les conna卯trait sous le nom de <a href="server_stubs_documentation.html">bouchons serveur</a>. </p> <p> Cependant non seulement les objets fantaisie jouent un r么le (en fournissant 脿 la demande les valeurs requises) mais en plus ils sont aussi sensibles aux messages qui leur sont envoy茅s (par le biais d'attentes). En posant les param猫tres attendus d'une m茅thode ils agissent comme des gardiens : un appel sur eux doit 锚tre r茅alis茅 correctement. Si les attentes ne sont pas atteintes ils nous 茅pargnent l'effort de l'茅criture d'une assertion de test avec 茅chec en r茅alisant cette t芒che 脿 notre place. Dans le cas d'une connexion 脿 une base de donn茅es imaginaire ils peuvent tester si la requ锚te, disons SQL, a bien 茅t茅 form茅 par l'objet qui utilise cette connexion. Mettez-les sur pied avec des attentes assez pr茅cises et vous verrez que vous n'aurez presque plus d'assertion 脿 茅crire manuellement. </p> <p><a class="target" name="creation"><h2>Cr茅er des objets fantaisie</h2></a></p> <p> Comme pour la cr茅ation des bouchons serveur, tout ce dont nous avons besoin c'est d'un classe existante. La fameuse connexion 脿 une base de donn茅es qui ressemblerait 脿...<pre><strong>class DatabaseConnection { function DatabaseConnection() { } function query() { } function selectQuery() { }}</strong></pre> Cette classe n'a pas encore besoin d'锚tre impl茅ment茅e. Pour en cr茅er sa version fantaisie nous devons juste inclure la librairie d'objet fantaisie puis lancer le g茅n茅rateur...<pre><strong>require_once('simpletest/unit_tester.php');require_once('simpletest/mock_objects.php');require_once('database_connection.php');Mock::generate('DatabaseConnection');</strong></pre> Ceci g茅n猫re une classe clone appel茅e <span class="new_code">MockDatabaseConnection</span>. Nous pouvons d茅sormais cr茅er des instances de cette nouvelle classe 脿 l'int茅rieur m锚me de notre sc茅nario de test...<pre>require_once('simpletest/unit_tester.php');require_once('simpletest/mock_objects.php');require_once('database_connection.php');Mock::generate('DatabaseConnection');<strong>class MyTestCase extends UnitTestCase { function testSomething() { $connection = &new MockDatabaseConnection($this); }}</strong></pre> Contrairement aux bouchons, le constructeur d'une classe fantaisie a besoin d'une r茅f茅rence au sc茅nario de test pour pouvoir transmettre les succ猫s et les 茅checs pendant qu'il v茅rifie les attentes. Concr猫tement 莽a veut dire que les objets fantaisie ne peuvent 锚tre utilis茅s qu'au sein d'un sc茅nario de test. Malgr茅 tout, cette puissance suppl茅mentaire implique que les bouchons ne sont que rarement utilis茅s si des objets fantaisie sont disponibles. </p> <p><a class="target" name="bouchon"><h2>Objets fantaisie en action</h2></a></p> <p> La version fantaisie d'une classe contient toutes les m茅thodes de l'originale. De la sorte une op茅ration comme <span class="new_code">$connection->query()</span> est encore possible. Tout comme avec les bouchons, nous pouvons remplacer la valeur nulle renvoy茅e par d茅faut...<pre><strong>$connection->setReturnValue('query', 37);</strong></pre> D茅sormais 脿 chaque appel de <span class="new_code">$connection->query()</span> nous recevons comme r茅sultat 37. Tout comme avec les bouchons nous pouvons utiliser des jokers et surcharger le param猫tre joker. Nous pouvons aussi ajouter des m茅thodes suppl茅mentaires 脿 l'objet fantaisie lors de sa g茅n茅ration et lui choisir un nom de classe qui lui soit propre...<pre><strong>Mock::generate('DatabaseConnection', 'MyMockDatabaseConnection', array('setOptions'));</strong></pre> Ici l'objet fantaisie se comportera comme si <span class="new_code">setOptions()</span> existait dans la classe originale. C'est pratique si une classe a utilis茅 le m茅canisme <span class="new_code">overload()</span> de PHP pour ajouter des m茅thodes dynamiques. Vous pouvez cr茅er des fantaisies sp茅ciales pour simuler cette situation. </p> <p> Tous les mod猫les disponibles avec les bouchons serveur le sont 茅galement avec les objets fantaisie...<pre>class Iterator { function Iterator() { } function next() { }}</pre> Une nouvelle fois, supposons que cet it茅rateur ne retourne que du texte jusqu'au moment o霉 il atteint son terme, quand il renvoie <span class="new_code">false</span>. Nous pouvons le simuler avec...<pre>Mock::generate('Iterator');class IteratorTest extends UnitTestCase() { function testASequence() {<strong> $iterator = &new MockIterator($this); $iterator->setReturnValue('next', false); $iterator->setReturnValueAt(0, 'next', 'First string'); $iterator->setReturnValueAt(1, 'next', 'Second string');</strong> ... }}</pre> Au moment du premier appel 脿 <span class="new_code">next()</span> sur l'it茅rateur fantaisie il renverra tout d'abord "First string", puis ce sera au tour de "Second string" au deuxi猫me appel et ensuite pour tout appel suivant <span class="new_code">false</span> sera renvoy茅. Ces valeurs renvoy茅es successivement sont prioritaires sur la valeur constante retourn茅e. Cette derni猫re est un genre de valeur par d茅faut si vous voulez. </p> <p> Reprenons aussi le conteneur d'information bouchonn茅 avec des pairs clef / valeur...<pre>class Configuration { function Configuration() { } function getValue($key) { }}</pre> Il s'agit l脿 d'une situation classique d'utilisation d'objets fantaisie 茅tant donn茅 que la configuration peut varier grandement de machine 脿 machine : 莽a contraint fortement la fiabilit茅 de nos tests si nous l'utilisons directement. Le probl猫me est que toutes les donn茅es nous parviennent 脿 travers la m茅thode <span class="new_code">getValue()</span> et que nous voulons des r茅sultats diff茅rents pour des clefs diff茅rentes. Heureusement les objets fantaisie ont un syst猫me de filtrage...<pre><strong>$config = &new MockConfiguration($this);$config->setReturnValue('getValue', 'primary', array('db_host'));$config->setReturnValue('getValue', 'admin', array('db_user'));$config->setReturnValue('getValue', 'secret', array('db_password'));</strong></pre> Le param猫tre en plus est une liste d'arguments 脿 faire correspondre. Dans ce cas nous essayons de faire correspondre un unique argument :
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?