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 = &amp;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-&gt;query()</span>                est encore possible.                Tout comme avec les bouchons, nous pouvons remplacer                la valeur nulle renvoy茅e par d茅faut...<pre><strong>$connection-&gt;setReturnValue('query', 37);</strong></pre>                D茅sormais 脿 chaque appel de                <span class="new_code">$connection-&gt;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 = &amp;new MockIterator($this);        $iterator-&gt;setReturnValue('next', false);        $iterator-&gt;setReturnValueAt(0, 'next', 'First string');        $iterator-&gt;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 = &amp;new MockConfiguration($this);$config-&gt;setReturnValue('getValue', 'primary', array('db_host'));$config-&gt;setReturnValue('getValue', 'admin', array('db_user'));$config-&gt;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 + -
显示快捷键?