Recherche…
Tests simples dans Symfony3
Test de l'unité
Les tests unitaires permettent de s’assurer que votre code n’a pas d’erreur de syntaxe et de tester la logique de votre code pour fonctionner comme prévu. Exemple rapide:
src / AppBundle / Calculatrice / BillCalculator.php
<?php namespace AppBundle\Calculator; use AppBundle\Calculator\TaxCalculator; class BillCalculator { private $taxCalculator; public function __construct(TaxCalculator $taxCalculator) { $this->taxCalculator = $taxCalculator; } public function calculate($products) { $totalPrice = 0; foreach ($products as $product) { $totalPrice += $product['price']; } $tax = $this->taxCalculator->calculate($totalPrice); return $totalPrice + $tax; } }
src / AppBundle / Calculatrice / TaxCalculator.php
<?php namespace AppBundle\Calculator; class TaxCalculator { public function calculate($price) { return $price * 0.1; // for example the tax is 10% } }
tests / AppBundle / Calculatrice / BillCalculatorTest.php
<?php namespace Tests\AppBundle\Calculator; class BillCalculatorTest extends \PHPUnit_Framework_TestCase { public function testCalculate() { $products = [ [ 'name' => 'A', 'price' => 100, ], [ 'name' => 'B', 'price' => 200, ], ]; $taxCalculator = $this->getMock(\AppBundle\Calculator\TaxCalculator::class); // I expect my BillCalculator to call $taxCalculator->calculate once // with 300 as the parameter $taxCalculator->expects($this->once())->method('calculate')->with(300)->willReturn(30); $billCalculator = new BillCalculator($taxCalculator); $price = $billCalculator->calculate($products); $this->assertEquals(330, $price); } }
J'ai testé ma classe BillCalculator afin de m'assurer que mon BillCalculator retournera le prix total des produits + 10% de taxe. Dans le test unitaire, nous créons notre propre cas de test. Dans ce test, je fournis 2 produits (les prix sont 100 et 200), la taxe sera donc de 10% = 30. Je m'attends à ce que TaxCalculator retourne 30, de sorte que le prix total sera de 300 + 30 = 330.
Test fonctionnel
Les tests fonctionnels sont utilisés pour tester les entrées et les sorties. Avec l'entrée donnée, je m'attendais à une sortie sans tester le processus pour créer la sortie. (ceci est différent avec le test unitaire car dans le test unitaire, nous testons le flux de code). Exemple rapide:
namespace Tests\AppBundle; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class ApplicationAvailabilityFunctionalTest extends WebTestCase { /** * @dataProvider urlProvider */ public function testPageIsSuccessful($url) { $client = self::createClient(); $client->request('GET', $url); $this->assertTrue($client->getResponse()->isSuccessful()); } public function urlProvider() { return array( array('/'), array('/posts'), array('/post/fixture-post-1'), array('/blog/category/fixture-category'), array('/archives'), // ... ); } }
J'ai testé mon contrôleur pour que mon contrôleur renvoie une réponse 200 au lieu de 400 (Introuvable) ou 500 (Erreur interne du serveur) avec l'URL indiquée.
Les références:
- http://symfony.com/doc/current/best_practices/tests.html
- http://symfony.com/doc/current/book/testing.html