éšåããã²ãŒã·ã§ã³
ããŒã1-Symfony2ãšãã³ãã¬ãŒãã®æ§æ
ããŒã2-é£çµ¡å ããŒãžïŒããªããŒã¿ãŒããã©ãŒã ãããã³ã¡ãŒã«
ããŒã3-Doctrine 2ãšããŒã¿ãã£ã¯ã¹ãã£
ããŒã4-Doctrine 2ã®ã³ã¡ã³ãã¢ãã«ããªããžããªã移è¡
ããŒã5-Twigæ¡åŒµããµã€ãããŒãããã³è³ç£
Githubãããžã§ã¯ã
å¿ èŠãªããã¥ã¢ã«ã®äžéšãã€ã³ã¹ããŒã«ããæ¹æ³ã«ã€ããŠã¯ã ãªã³ã¯ã§ãªããžããªã®èª¬æãåç §ããŠãã ãã ã ïŒããšãã°ãåã®ã¬ãã¹ã³ãçµãã«ãã®ã¬ãã¹ã³ããå§ãããå ŽåïŒ
Symfony2ã§ã®ãã¹ã
PHPUnitã¯ãPHPã§ãã¹ããèšè¿°ããããã®ãäºå®äžã®æšæºãã«ãªã£ãŠãããããPHPUnitãåŠç¿ããããšã¯ããã¹ãŠã®PHPãããžã§ã¯ãã§åœ¹ç«ã¡ãŸãã ãŸãããã®ããŒãã§æ±ããããã¯ã®ã»ãšãã©ã¯èšèªã«äŸåããªãããã䜿çšããä»ã®èšèªã«é©çšã§ããããšãå¿ããªãã§ãã ããã
ãã³ã
ç¬èªã®Symfony2ãªãŒãã³ãœãŒã¹ãã³ãã«ãäœæããäºå®ã®å Žåããã³ãã«ãååã«ãã¹ãïŒããã³ææžåïŒãããŠããã°ããŠãŒã¶ãŒããè¯ãåå¿ãåŸãå¯èœæ§ãã¯ããã«é«ããªããŸãã knpbundlesã§å©çšå¯èœãªæ¢åã®symfony2ãã³ãã«ã®ãªã¹ããèŠãŠãã ãã ã
åäœãã¹ã
åäœãã¹ãã¯ãåç¬ã§äœ¿çšããå Žåã«åã ã®æ©èœãŠãããã®æ£ããåäœãæ€èšŒããŸãã Symfony2ã®ããã«ããªããžã§ã¯ãæåã®ã³ãŒãã§ã¯ãã¢ãžã¥ãŒã«ã¯ã¯ã©ã¹ãšãã®ã¡ãœããã§ãã ããšãã°ãBlogããã³Commentãšã³ãã£ãã£ã¯ã©ã¹ã®ãã¹ããäœæã§ããŸãã åäœãã¹ããäœæããå Žåããã¹ãã¯ä»ã®ãã¹ããšã¯ç¡é¢ä¿ã«äœæããå¿ èŠããããŸããã€ãŸãããã¹ãBã®çµæã¯çµæAã«äŸåããã¹ãã§ã¯ãããŸããã åäœãã¹ãã䜿çšãããšãå€éšäŸåé¢ä¿ãæã€é¢æ°ããã¹ãã§ãããããŒãªããžã§ã¯ããäœæã§ããŸãã æ¶ç©ºã®ãªããžã§ã¯ãïŒMokiïŒã䜿çšãããšãå®éã®å®è¡ã®ä»£ããã«é¢æ°åŒã³åºããã·ãã¥ã¬ãŒãã§ããŸãã ãã®äŸã¯ãå€éšAPIãã©ããããã¯ã©ã¹ã®ãŠããããã¹ãã§ãã APIã¯ã©ã¹ã¯ããã©ã³ã¹ããŒãå±€ãããã³ã«ã䜿çšããŠå€éšAPIãšéä¿¡ã§ããŸãã å®éã«å€éšAPIããè¿ãã®ã§ã¯ãªãããããŒã®ãã©ã³ã¹ããŒãã¬ãã«ã®ãªã¯ãšã¹ãã¡ãœãããäœæããŠãèšå®ããçµæãè¿ãããšãã§ããŸãã 次ã®ã»ã¯ã·ã§ã³ã§ç€ºãããã«ãåäœãã¹ãã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ããäžç·ã«æ©èœããããšã確èªããŸããã
æ©èœãã¹ã
æ©èœãã¹ãã§ã¯ãã«ãŒãã£ã³ã°ãã³ã³ãããŒã©ãŒããããã³ã°ãªã©ã®ããŸããŸãªã¢ããªã±ãŒã·ã§ã³ã³ã³ããŒãã³ãã®çµ±åãæ€èšŒããŸãã æ©èœãã¹ãã¯ããã©ãŠã¶ã§å®è¡ã§ããæåãã¹ãã«äŒŒãŠããŸããããšãã°ãã¡ã€ã³ããŒãžã®èŠæ±ãã¬ã³ãŒãã®ãªã³ã¯ã®ã¯ãªãã¯ã衚瀺ã®æ£ç¢ºæ§ã®ç¢ºèªãªã©ã§ãã æ©èœãã¹ãã«ããããã®ããã»ã¹ãèªååã§ããŸãã Symfony2ã«ã¯ãããŒãžãªã¯ãšã¹ãããã©ãŒã ã®éä¿¡ãã¯ã©ã€ã¢ã³ãããã®å¿çããã€ãã¹ããããã«äœ¿çšã§ããã¯ããŒã©ãŒDOMãå®è¡ã§ããClientãªã©ãæ©èœãã¹ãã«åœ¹ç«ã€å€ãã®äŸ¿å©ãªã¯ã©ã¹ãä»å±ããŠããŸãã
Phpunit
åè¿°ã®ããã«ãSymfony2ãã¹ãã¯PHPUnitã䜿çšããŠèšè¿°ãããŠããŸãã ãã®éšåãããã¹ããå®è¡ããã«ã¯ãPHPUnitãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã ã€ã³ã¹ããŒã«ã®è©³çŽ°ã«ã€ããŠã¯ãPHPUnit Webãµã€ãã®å ¬åŒããã¥ã¡ã³ããåç §ããŠãã ããã Symfony2ã§ãã¹ããå®è¡ããã«ã¯ãPHPUnit 5.4ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãïŒPHP 5.6ãå¿ èŠã§ãïŒã PHPUnitã¯éåžžã«å€§ããªãã¹ãã©ã€ãã©ãªã§ãããã®æ¥ç¶ã§ã¯ãè¿œå ã®æ å ±ãå¿ èŠã«ãªãå¯èœæ§ã®ããå ¬åŒããã¥ã¡ã³ããžã®ãªã³ã¯ãäœæãããŸãã
ã¢ãµãŒã·ã§ã³
ãã¹ããæžãããšã¯ãäºæ³ããããã¹ãçµæãå®éã®çµæãšçãããã©ããã®ãã¹ãã§ãã PHPUnitã«ã¯ããã®ã¿ã¹ã¯ãæ¯æŽããå€ãã®ã¢ãµãŒã·ã§ã³ã¡ãœããããããŸãã 䜿çšããäžè¬çãªã¢ãµãŒã·ã§ã³ã¡ãœããã®äžéšã以äžã«ãªã¹ãããŸãã
// Check 1 === 1 is true $this->assertTrue(1 === 1); // Check 1 === 2 is false $this->assertFalse(1 === 2); // Check 'Hello' equals 'Hello' $this->assertEquals('Hello', 'Hello'); // Check array has key 'language' $this->assertArrayHasKey('language', array('language' => 'php', 'size' => '1024')); // Check array contains value 'php' $this->assertContains('php', array('php', 'ruby', 'c++', 'JavaScript'));
ã¢ãµãŒã·ã§ã³ã®å®å šãªãªã¹ãã¯ã PHPUnitã®ããã¥ã¡ã³ãã«ãããŸãã
Symfony2ãã¹ãã®å®è¡
ãã¹ãã®äœæãå§ããåã«ãSymfony2ã§ãã¹ããå®è¡ããæ¹æ³ãèŠãŠã¿ãŸãããã ãŠãããã¯æ§æãã¡ã€ã«ã䜿çšã§ããŸãã Symfony2ãããžã§ã¯ãã§ã¯ããã®ãã¡ã€ã«ã¯app / phpunit.xml.distã«ãããŸãã ãã®ãã¡ã€ã«ã«ã¯æ¥å°ŸèŸ.distãä»ããŠãããã ããã®å 容ãapp / phpunit.xmlãšãããã¡ã€ã«ã«ã³ããŒããå¿ èŠããããŸãã
ãã³ã
Gitãªã©ã®VCSã䜿çšããŠããå Žåã¯ã app / phpunit.xmlãã¡ã€ã«ãç¡èŠãªã¹ãã«è¿œå ããå¿ èŠããããŸã ã
PHPUnitæ§æãã¡ã€ã«ã®å 容ãèŠããšã次ã®ããšãããããŸãã
<!-- app/phpunit.xml --> <testsuites> <testsuite name="Project Test Suite"> <directory>../src/*/*Bundle/Tests</directory> <directory>../src/*/Bundle/*Bundle/Tests</directory> </testsuite> </testsuites>
ãããã®ãªãã·ã§ã³ã¯ããã¹ãã¹ã€ãŒãã®äžéšã§ããããã€ãã®ãã£ã¬ã¯ããªãæ§æããŸãã èµ·åãããšã PHPUnitã¯äžèšã®ãã£ã¬ã¯ããªã§å®è¡ãããã¹ããæ¢ããŸãã ã³ãã³ãã©ã€ã³ããè¿œå ã®åŒæ°ãæž¡ããŠãç¹å®ã®ãã£ã¬ã¯ããªã§PHPUnitãã¹ããå®è¡ããããšãã§ããŸãã åŸã§ãããå®çŸããæ¹æ³ãããããŸãã
ãã³ã
XMLãã¡ã€ã«ã䜿çšããPHPUnitã®æ§æã®è©³çŽ°ã«ã€ããŠã¯ã PHPUnitã®ããã¥ã¡ã³ããåç §ããŠãã ããã
çŸåšã®ãã¹ãã®å®è¡
Symfony2ãžã§ãã¬ãŒã¿ãŒã³ãã³ãã®1ã€ã䜿çšããŠæåã®éšåã§Blogger BlogBuâândleãäœæããããã圌女ã¯Default Controllerã¯ã©ã¹ã®ã³ã³ãããŒã©ãŒãã¹ããäœæããŸããã ãããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªãã次ã®ã³ãã³ããå®è¡ããŠããã®ãã¹ããå®è¡ã§ããŸãã -cãªãã·ã§ã³ã¯ãPHPUnitãappãã£ã¬ã¯ããªããèšå®ãããŒãããå¿ èŠãããããšã瀺ããŸãã
$ phpunit -c app
ãã¹ããå®äºãããšããã¹ãã倱æããããšãéç¥ãããŸãã src / Blogger / BlogBuâândle / Tests / Controller / DefaultControllerTest.phpã«ããDefaultControllerTestã¯ã©ã¹ãèŠããšã
次ã®ã³ã³ãã³ã
<?php namespace Blogger\BlogBundle\Tests\Controller; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class DefaultControllerTest extends WebTestCase { public function testIndex() { $client = static::createClient(); $crawler = $client->request('GET', '/'); $this->assertContains('Hello World', $client->getResponse()->getContent()); } }
ããã¯ãSymfony2ãçæããããã©ã«ãã³ã³ãããŒã©ãŒã¯ã©ã¹ã®æ©èœãã¹ãã§ãã ããŒã1ã§èŠããŠããå Žåããã®ã³ã³ãããŒã©ãŒã«ã¯ãªã¯ãšã¹ããåŠçããã¡ãœããããããŸãã/ãã®ã¢ãã¬ã¹ã§ã ãHello Worldãã®å 容ãæã€ãã³ãã¬ãŒãã衚瀺ããŸããã ãã®ã³ã³ãããŒã©ãŒãåé€ãããã®ã«ãŒãã®ãã³ãã¬ãŒãã®å 容ããŸã£ããç°ãªããããäžèšã®ãã¹ãã¯å€±æããŸãã
æ©èœãã¹ãã¯ãã®ç« ã®å€§éšåã§ãããåŸã§è©³ãã説æããŸãã
Default Controllerã¯ã©ã¹ãåé€ãããããã src / Blogger / BlogBuâândle / Tests / Controller / DefaultControllerTest.phpãã¡ã€ã«ãåé€ã§ããŸã
åäœãã¹ã
åã«èª¬æããããã«ããŠããããã¹ããšã¯ãã¢ããªã±ãŒã·ã§ã³ã®åã ã®ãŠããããåå¥ã«ãã¹ãããããšã§ãã åäœãã¹ããäœæãããšãã¯ããã¹ããã©ã«ããŒã«ãã³ãã«ã®æ§é ãè€è£œããããšããå§ãããŸãã ããšãã°ã src / Blogger / BlogBuâândle / Entity / Blog.phpã«ããBlogã¯ã©ã¹ãšã³ãã£ãã£ããã¹ãããå Žåããã¹ããã¡ã€ã«ã¯src / Blogger / BlogBuâândle / Tests / Entity / BlogTest.phpã«ãããŸãã äŸã¯æ¬¡ã®ããã«ãªããŸã
次ã®ããã«
src/Blogger/BlogBundle/ Entity/ Blog.php Comment.php Controller/ PageController.php Twig/ Extensions/ BloggerBlogExtension.php Tests/ Entity/ BlogTest.php CommentTest.php Controller/ PageControllerTest.php Twig/ Extensions/ BloggerBlogExtensionTest.php
åãã¹ããã¡ã€ã«ã«ã¯æ¥å°ŸèŸTestãä»ããŠããããšã«æ³šæããŠãã ããã
ããã°ãšã³ãã£ãã£ãã¹ã-slugifyã¡ãœãã
Blogãšã³ãã£ãã£ã§slugifyã¡ãœããã®ãã¹ããéå§ããŸãã ãã®ã¡ãœãããæ£ããæ©èœããããšã確èªããããã®ãã¹ããäœæããŸãããã ã«ããæ°ãããã¡ã€ã«ãäœæããŸã
src / Blogger / BlogBuâândle / Tests / Entity / BlogTest.php
<?php // src/Blogger/BlogBundle/Tests/Entity/BlogTest.php namespace Blogger\BlogBundle\Tests\Entity; use Blogger\BlogBundle\Entity\Blog; class BlogTest extends \PHPUnit_Framework_TestCase { }
Blogãšã³ãã£ãã£ã®ãã¹ãã¯ã©ã¹ãäœæããŸããã ãã¡ã€ã«ã®å Žæã¯ãäžèšã®ãã©ã«ããŒæ§é ã«åŸãããšã«æ³šæããŠãã ããã Blog Testã¯ã©ã¹ã¯ãåºæ¬PHPUnitã¯ã©ã¹PHPUnit_Framework_TestCaseãæ¡åŒµããŸãã PHPUnitçšã«èšè¿°ãããã¹ãŠã®ãã¹ãã¯ããã®ã¯ã©ã¹ã®åå«ã«ãªããŸãã ã¯ã©ã¹ã¯å ±éã®PHPåå空éã§å®£èšãããŠãããããåã®éšåãããã¯ã©ã¹åPHPUnit_Framework_TestCaseã®åã«\ãé 眮ããå¿ èŠãããããšãèŠããŠããŸãã
Blogãšã³ãã£ãã£ãã¹ãã®ã¯ã©ã¹ã¹ã±ã«ãã³ãã§ããŸããããã¹ããäœæããŸãããã PHPUnitã®ãã¹ãã¯ã testSlugifyïŒïŒãªã©ããã¹ããã¬ãã£ãã¯ã¹ä»ãã®Testã¯ã©ã¹ã®ã¡ãœããã§ãã BlogTestãæŽæ°ããŸã
src / Blogger / BlogBuâândle / Tests / Entity / BlogTest.php
// src/Blogger/BlogBundle/Tests/Entity/BlogTest.php // .. class BlogTest extends \PHPUnit_Framework_TestCase { public function testSlugify() { $blog = new Blog(); $this->assertEquals('hello-world', $blog->slugify('Hello World')); } }
ããã¯éåžžã«ç°¡åãªãã¹ãã§ãã æ°ããBlogãšã³ãã£ãã£ãäœæããslugifyã¡ãœããã®çµæã«å¯ŸããŠassertEqualsïŒïŒãå®è¡ããŸãã assertEqualsïŒïŒã¡ãœããã¯ã2ã€ã®å¿ é åŒæ°ãäºæãããçµæãšå®éã®çµæãåããŸãã ãªãã·ã§ã³ã®3çªç®ã®åŒæ°ãæž¡ããŠããã¹ãã倱æãããšãã«ã¡ãã»ãŒãžã衚瀺ã§ããŸãã
æ°ããåäœãã¹ããå®è¡ããŸãããã ã³ã³ãœãŒã«ã§æ¬¡ã®ã³ãã³ããå ¥åããŸãã
$ phpunit -c app
以äžã衚瀺ãããŸãã
PHPUnit 5.4.6 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 348 ms, Memory: 13.25MB OK (1 test, 1 assertion)
PHP Unitã®çµè«ã¯éåžžã«ç°¡åã§ãããŸããPHPUnitã«é¢ããããã€ãã®æ å ±ãšåãã¹ãã®å®è¡åæ°ã衚瀺ãããŸãããã®å Žåããã¹ãã¯1ã€ã ãã§ãã æåŸã«ã圌ã¯ãã¹ãçµæãç§ãã¡ã«ç¥ãããŸãã BlogTestã§ã¯ã1ã€ã®ã¹ããŒãã¡ã³ãã§1ã€ã®ãã¹ãã®ã¿ãå®è¡ããŸããã ã³ãã³ãã©ã€ã³ã§ã«ã©ãŒåºåãæ§æããŠããå ŽåãæåŸã®è¡ãç·è²ã§ç¶²æããããŠããããšãããããŸãã testSlugifyïŒïŒã¡ãœãããæŽæ°ããŠããã¹ãã倱æãããšãã«äœãèµ·ããããèŠãŠã¿ãŸãããã
// src/Blogger/BlogBundle/Tests/Entity/BlogTest.php // .. public function testSlugify() { $blog = new Blog(); $this->assertEquals('hello-world', $blog->slugify('Hello World')); $this->assertEquals('a day with symfony2', $blog->slugify('A Day With Symfony2')); }
åãšåæ§ã«åäœãã¹ããåéããŸãã 衚瀺ãããŸã
次ã®
PHPUnit 5.4.6 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 340 ms, Memory: 13.25MB There was 1 failure: 1) Blogger\BlogBundle\Tests\Entity\BlogTest::testSlugify Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'a day with symfony2' +'a-day-with-symfony2' D:\local\symfony-blog\src\Blogger\BlogBundle\Tests\Entity\BlogTest.php:15 FAILURES! Tests: 1, Assertions: 2, Failures: 1.
ä»åã®çµè«ã¯ããå°ãã§ãã Fèšå·ã¯ããã¹ãã倱æããããšã瀺ããŠããŸãã ãã¹ãã«ãšã©ãŒãå«ãŸããŠããå Žåã¯ã Eã衚瀺ãããŸãã ããã«ãPHPãŠããããé害ã®è©³çŽ°ïŒãã®å Žåã¯1ïŒãéç¥ããŸãã ã¡ãœããBlogger \ BlogBuâândle \ Tests \ Entity \ BlogTest :: testSlugifyã¯ãæåŸ å€ãšå®éã®å€ãç°ãªããã倱æããããšãããããŸãã ã³ãã³ãã©ã€ã³ã«ã«ã©ãŒåºåãããå ŽåãæåŸã®è¡ãèµ€ã§ç¶²æããããŠããããšãããããŸããããã¯ããã¹ãã«ãšã©ãŒãããããšã瀺ããŠããŸãã testSlugifyïŒïŒã¡ãœãããä¿®æ£ããŠãæåããããã«ããŸãã
// src/Blogger/BlogBundle/Tests/Entity/BlogTest.php // .. public function testSlugify() { $blog = new Blog(); $this->assertEquals('hello-world', $blog->slugify('Hello World')); $this->assertEquals('a-day-with-symfony2', $blog->slugify('A Day With Symfony2')); }
å ã«é²ãåã«ãããã«ããã€ãã®ãã¹ããè¿œå ããŸãã
slugifyïŒïŒã¡ãœããã®
// src/Blogger/BlogBundle/Tests/Entity/BlogTest.php // .. public function testSlugify() { $blog = new Blog(); $this->assertEquals('hello-world', $blog->slugify('Hello World')); $this->assertEquals('a-day-with-symfony2', $blog->slugify('A Day With Symfony2')); $this->assertEquals('hello-world', $blog->slugify('Hello world')); $this->assertEquals('symblog', $blog->slugify('symblog ')); $this->assertEquals('symblog', $blog->slugify(' symblog')); }
slugifyã¡ãœããããã¹ãããã®ã§ãBlog $ã¿ã€ãã«ãæŽæ°ããããšãã«Blog $ slugãæ£ããã€ã³ã¹ããŒã«ãããŠããããšã確èªããå¿ èŠããããŸãã 次ã®ã¡ãœããããã¡ã€ã«ã«è¿œå ããŸã
src / Blogger / BlogBuâândle / Tests / Entity / BlogTest.php
// src/Blogger/BlogBundle/Tests/Entity/BlogTest.php // .. public function testSetSlug() { $blog = new Blog(); $blog->setSlug('Symfony2 Blog'); $this->assertEquals('symfony2-blog', $blog->getSlug()); } public function testSetTitle() { $blog = new Blog(); $blog->setTitle('Hello World'); $this->assertEquals('hello-world', $blog->getSlug()); }
setSlugã¡ãœããããã¹ãããŠãæŽæ°æã«$ slugèŠçŽ ãã¹ã©ãã°ãæ£ããè¿œå ããããšã確èªããããšããå§ããŸããã 次ã«ãsetTitleã¡ãœãããBlogãšã³ãã£ãã£ã«ãã£ãŠåŒã³åºããããšã$ slugãæ£ããæŽæ°ãããããšã確èªããŸãã
ãã¹ããå®è¡ããŠãããã°ãšã³ãã£ãã£ã®ç¶æ ã確èªããŸãã
Twigæ¡åŒµã®ãã¹ã
åã®ããŒãã§ã¯ã \ DateTimeãæååã«å€æããŠã³ã¡ã³ããæçš¿ãããŠããã®çµéæéã決å®ããTwigæ¡åŒµæ©èœãäœæããŸããã æ°ãããã¡ã€ã«ãäœæãã
src / Blogger / BlogBuâândle /ãã¹ã/ Twig /æ¡åŒµæ©èœ/ BloggerBlogExtensionTest.php
<?php // src/Blogger/BlogBundle/Tests/Twig/Extensions/BloggerBlogExtensionTest.php namespace Blogger\BlogBundle\Tests\Twig\Extensions; use Blogger\BlogBundle\Twig\Extensions\BloggerBlogExtension; class BloggerBlogExtensionTest extends \PHPUnit_Framework_TestCase { public function testCreatedAgo() { $blog = new BloggerBlogExtension(); $this->assertEquals("0 seconds ago", $blog->createdAgo(new \DateTime())); $this->assertEquals("34 seconds ago", $blog->createdAgo($this->getDateTime(-34))); $this->assertEquals("1 minute ago", $blog->createdAgo($this->getDateTime(-60))); $this->assertEquals("2 minutes ago", $blog->createdAgo($this->getDateTime(-120))); $this->assertEquals("1 hour ago", $blog->createdAgo($this->getDateTime(-3600))); $this->assertEquals("1 hour ago", $blog->createdAgo($this->getDateTime(-3601))); $this->assertEquals("2 hours ago", $blog->createdAgo($this->getDateTime(-7200))); // Cannot create time in the future $this->setExpectedException('\InvalidArgumentException'); $blog->createdAgo($this->getDateTime(60)); } protected function getDateTime($delta) { return new \DateTime(date("Ymd H:i:s", time()+$delta)); } }
ã¯ã©ã¹ã¯ä»¥åã®ããã«æ§æãããtestCreatedAgoïŒïŒã¡ãœãããäœæããŠTwigæ¡åŒµããã¹ãããŸãã ãã®setExpectedExceptionïŒïŒãã¹ãã§å¥ã®PHPUnitã¡ãœãããå°å ¥ããŸããã Twigæ¡åŒµã®createdAgoã¡ãœããã¯å°æ¥ã®æ¥ä»ãåŠçã§ããã\ Exceptionã«æž¡ãããããšãããã£ãŠããŸãã getDateTimeïŒïŒã¡ãœããã¯ã\ DateTimeã®ã€ã³ã¹ã¿ã³ã¹ãäœæããè£å©ã§ãã ãã¹ããã¬ãã£ãã¯ã¹ããªããããPHPãŠãããã¯ãã¹ããšããŠãããå®è¡ããããšããŸããã ã³ã³ãœãŒã«ãéãããã®ãã¡ã€ã«ã®ãã¹ããå®è¡ããŸãã 以åã®ããã«ãã¹ããå®è¡ããããšãã§ããŸãããç¹å®ã®ãã©ã«ããŒïŒããã³ãµããã©ã«ããŒïŒãŸãã¯ãã¡ã€ã«ã«å¯ŸããŠã®ã¿ãã¹ããå®è¡ããããã«PHPUnitã«æ瀺ããããšãã§ããŸãã 次ã®ã³ãã³ããå ¥åããŸãã
$ phpunit -c app src/Blogger/BlogBundle/Tests/Twig/Extensions/BloggerBlogExtensionTest.php
ããã«ãããBloggerBlogExtensionTestãã¡ã€ã«ã®ãã¹ãã®ã¿ãå®è¡ãããŸãã PHPUnitã¯ããã¹ãã倱æããããšãéç¥ããŸãã çµè«ã以äžã«ç€ºããŸãã
1) Blogger\BlogBundle\Tests\Twig\Extensions\BloggerBlogExtensionTest::testCreatedAgo Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'0 seconds ago' +'0 second ago' //..
æåã®ã¹ããŒãã¡ã³ãã¯0ç§åã«è¿ããããšäºæ³ããŠããŸãããã2çªç®ã®åèªãè€æ°åœ¢ã§ã¯ãªãã£ãããè¿ãããŸããã§ããã Twigæ¡åŒµæ©èœãæŽæ°ããŠä¿®æ£ããŠã¿ãŸãããã
src / Blogger / BlogBuâândle / Twig /æ¡åŒµæ©èœ/ BloggerBlogBuâândle.php
<?php // src/Blogger/BlogBundle/Twig/Extensions/BloggerBlogBundle.php namespace Blogger\BlogBundle\Twig\Extensions; class BloggerBlogExtension extends \Twig_Extension { // .. public function createdAgo(\DateTime $dateTime) { // .. if ($delta < 60) { // Seconds $time = $delta; $duration = $time . " second" . (($time === 0 || $time > 1) ? "s" : "") . " ago"; } // .. } // .. }
åäœãã¹ããåèµ·åããŸãã æåã®ã¹ããŒãã¡ã³ãã¯æ£ãã衚瀺ãããŸããããã¹ãã¯å€±æããŸãã 次ã®çµè«ãèŠãŠã¿ãŸãããã
1) Blogger\BlogBundle\Tests\Twig\Extensions\BloggerBlogExtensionTest::testCreatedAgo Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'1 hour ago' +'60 minutes ago'
5çªç®ã®ã¹ããŒãã¡ã³ãã倱æããããšãããããŸãã ãã¹ããèŠããšãTwigæ¡åŒµãé©åã«æ©èœããŠããªãããšãããããŸãã 1æéåã«è¿ãããã¯ãã§ãããã代ããã«60ååã«è¿ãããŸããã BloggerBlogExtension Twigã®ã³ãŒããèŠããšããã®çç±ãããããŸãã ãªã³ã«ã§ããæéãæ¯èŒããŸããã€ãŸãã <ã®ä»£ããã«< =ã䜿çšããŸãã Twigæ¡åŒµæ©èœãæŽæ°ããŠä¿®æ£ãã
src / Blogger / BlogBuâândle / Twig /æ¡åŒµæ©èœ/ BloggerBlogBuâândle.php
<?php // src/Blogger/BlogBundle/Twig/Extensions/BloggerBlogBundle.php namespace Blogger\BlogBundle\Twig\Extensions; class BloggerBlogExtension extends \Twig_Extension { // .. public function createdAgo(\DateTime $dateTime) { // .. else if ($delta < 3600) { // Mins $time = floor($delta / 60); $duration = $time . " minute" . (($time > 1) ? "s" : "") . " ago"; } else if ($delta < 86400) { // Hours $time = floor($delta / 3600); $duration = $time . " hour" . (($time > 1) ? "s" : "") . " ago"; } // .. } // .. }
次ã®ã³ãã³ãã䜿çšããŠããã¹ãŠã®ãã¹ããå床å®è¡ããŸãã
$ phpunit -c app
ããã«ããããã¹ãŠã®ãã¹ããå®è¡ããããã¹ãŠã®ãã¹ããæåããããšã瀺ãããŸãã å°æ°ã®åäœãã¹ãã®ã¿ãèšè¿°ããŸããããã³ãŒããèšè¿°ãããšãã®ãã¹ããã©ãã»ã©åŒ·åã§éèŠãªãã®ã§ããããç解ããŠãã ããã ãã¹ãã¯ã以åã®æ©èœãæãªãããšãªãããããžã§ã¯ãã«å°æ¥ã®æ©èœãè¿œå ããã®ã«ã圹ç«ã¡ãŸãã ããã§ãåäœãã¹ãã®ã¬ãã¥ãŒãçµäºããŸãã
ãã³ã
ç¬èªã®åäœãã¹ããè¿œå ããŠã¿ãŠãã ããã
æ©èœãã¹ã
ãŠããããã¹ããããã€ãäœæããŸããã次ã«ãããã€ãã®ã³ã³ããŒãã³ããäžç·ã«ãã¹ãããŸãã æ©èœãã¹ãã®æåã®ã»ã¯ã·ã§ã³ã«ã¯ãçæãããå¿çããã¹ãããããã®ãã©ãŠã¶ãŒèŠæ±ã®ã·ãã¥ã¬ãŒã·ã§ã³ãå«ãŸããŸãã
AboutããŒãžã®ãã¹ã
ãŸããAboutããŒãžã®PageControllerã¯ã©ã¹ããã¹ãããŸãã ããŒãžã¯éåžžã«ã·ã³ãã«ãªã®ã§ãããããå§ããã®ãè¯ãã§ãããã æ°ãããã¡ã€ã«ãäœæãã
src / Blogger / BlogBuâândle / Tests / Controller / PageControllerTest.php
<?php // src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php namespace Blogger\BlogBundle\Tests\Controller; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class PageControllerTest extends WebTestCase { public function testAbout() { $client = static::createClient(); $crawler = $client->request('GET', '/about'); $this->assertEquals(1, $crawler->filter('h1:contains("About symblog")')->count()); } }
ã³ã³ãããŒã©ã®ãã¹ãã¯DefaultControllerTestã¯ã©ã¹ã«éåžžã«äŒŒãŠããããšãããããŸãã aboutããŒãžããã¹ãããŠãçæãããHTMLå ãã€ãŸãH1ã¿ã°å ã«ããAbout symblogè¡ã確èªããŸãã PageControllerTestã¯ã©ã¹ã¯ããŠããããã¹ãã®äŸã§èŠãããã«ã\ PHPUnit_Framework_TestCaseãæ¡åŒµããŸãããã代ããã«WebTestCaseã¯ã©ã¹ãæ¡åŒµããŸãã ãã®ã¯ã©ã¹ã¯Symfony2 FrameworkBundleã®äžéšã§ãã
äžèšã§èª¬æããããã«ãPHPUnitãã¹ãã¯ã©ã¹ã¯\ PHPUnit_Framework_TestCaseãæ¡åŒµããå¿ èŠããããŸãããããã€ãã®ãã¹ãã§è¿œå ãŸãã¯äžè¬çãªæ©èœãå¿ èŠãªå Žåã¯ãç¬èªã®ã¯ã©ã¹ã«ã«ãã»ã«åããŠãã¹ãã¯ã©ã¹ãæ¡åŒµãããšäŸ¿å©ã§ãã WebTestCaseã¯ãŸãã«ãããè¡ããSymfony2ã§æ©èœãã¹ããå®è¡ããããã®ããã€ãã®äŸ¿å©ãªã¡ãœãããæäŸããŸãã vendor / symfony / symfony / src / Symfony / Bundle / FrameworkBundle / Test / WebTestCase.phpã«ããWebTestCaseãã¡ã€ã«ãèŠããšããã®ã¯ã©ã¹ãå®éã«ã¯KernelTestCaseã¯ã©ã¹ã®æ¡åŒµã§ããããšãããããŸãã
// vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Test/WebTestCase.php abstract class WebTestCase extends KernelTestCase { // .. }
WebTestCaseã¯ã©ã¹ã®createClientïŒïŒã¡ãœãããèŠããšãSymfony2ã«ãŒãã«ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããŠããããšãããããŸãã ããã«ã¡ãœãããå®è¡ãããšãïŒcreateClientïŒïŒåŒæ°ã®1ã€ãšããŠãªãŒããŒã©ã€ããããªãéãïŒç°å¢ããã¹ãã«èšå®ãããŠããããšã«ãæ°ä»ãã§ãããã ããã¯ãåã®ããŒãã§èª¬æãããã¹ãç°å¢ã§ãã
ãã¹ãã¯ã©ã¹ãèŠããšããã¹ããååŸããŠå®è¡ããããã«createClientïŒïŒã¡ãœãããåŒã³åºãããŠããããšãããããŸãã 次ã«ãã¯ã©ã€ã¢ã³ãåŽã§requestïŒïŒã¡ãœãããåŒã³åºããŠããã©ãŠã¶ã®URL / aboutã§GET HTTPãªã¯ãšã¹ããã·ãã¥ã¬ãŒãããŸãïŒãã©ãŠã¶ã§httpïŒ// localhostïŒ8000 / aboutããŒãžã«ã¢ã¯ã»ã¹ããå ŽåããŸã£ããåãã§ãïŒã èŠæ±ã¯ãå¿çãå«ãCrawlerãªããžã§ã¯ããæäŸããŸãã Crawlerã¯ã©ã¹ã¯ãè¿ãããHTMLã移åã§ãããããéåžžã«äŸ¿å©ã§ãã Crawlerã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠãHTMLå¿çã®H1ã¿ã°ã«About symblogãšããåèªãå«ãŸããŠããããšã確èªããŸãã WebTestCaseã¯ã©ã¹ãæ¡åŒµããŠãã以åãšåãããã«Assertã¡ãœããã䜿çšããŸãïŒPageControllerTestã¯ã©ã¹ã¯\ PHPUnit_Framework_TestCaseã¯ã©ã¹ã®åå«ã§ããããšã«æ³šæããŠãã ããïŒã
次ã®ã³ãã³ãã§PageControllerTestãå®è¡ããŸãããã ãã¹ããäœæãããšãã¯ãçŸåšäœæ¥ããŠãããã¡ã€ã«ã«å¯ŸããŠã®ã¿ãã¹ããå®è¡ããããã«äœ¿çšãããšäŸ¿å©ã§ãã
$ phpunit -c app/ src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php
ã¡ãã»ãŒãžOKïŒ1ã€ã®ãã¹ãã1ã€ã®ã¢ãµãŒã·ã§ã³ïŒã衚瀺ããã1ã€ã®ã¹ããŒãã¡ã³ãïŒassertEqualsïŒïŒïŒãå«ã1ã€ã®ãã¹ãïŒtestAboutïŒïŒãèµ·åãããããšïŒãããããŸãã
About symblogè¡ãContactã«å€æŽããŠããããã¹ããå床å®è¡ããŠãã ããã ContactãèŠã€ããããassertEqualsãfalseã«ãªãããããã¹ãã¯å€±æããŸãã
ç¶è¡ããåã«ãsymblogã«ã€ããŠã®è¡ãæ»ããŸãã
Crawlerã€ã³ã¹ã¿ã³ã¹ã䜿çšãããšãHTMLãŸãã¯XMLããã¥ã¡ã³ãã衚瀺ã§ããŸãïŒã€ãŸããCrawlerã¯HTMLãŸãã¯XMLãè¿ãå¿çã§ã®ã¿æ©èœããŸãïŒã Crawlerã䜿çšããŠãfilterïŒïŒãfirstïŒïŒãlastïŒïŒãparentïŒïŒãªã©ã®ã¡ãœããã䜿çšããŠãçæãããå¿çãèµ°æ»ã§ããŸãã 以åã«jQueryã䜿çšããããšãããå Žåã¯ãCrawlerã¯ã©ã¹ã«æ £ããå¿ èŠããããŸãã ãµããŒããããŠããã¯ããŒã©ãŒã®åé¿çã®å®å šãªãªã¹ãã«ã€ããŠã¯ãSymfony2ã®ãã¹ãã®ç« ãåç §ããŠãã ããã
ããŒã ããŒãž
[About]ããŒãžã®ãã¹ãã¯ç°¡åã§ãããããµã€ãããŒãžã®æ©èœãã¹ãã®åºæ¬ååãæŠèª¬ããŸããã
顧客ã®åµé
ããŒãžãªã¯ãšã¹ã
å¿çãã§ãã¯
ããã¯ããã»ã¹ã®ç°¡åãªæŠèŠã§ãããå®éã«ã¯ããªã³ã¯ãã¯ãªãã¯ããããã©ãŒã ã«èšå ¥ããŠéä¿¡ãããªã©ãä»ã®å€ãã®æé ãå®è¡ã§ããŸãã
ããŒã ããŒãžããã¹ãããã¡ãœãããäœæããŸãããã ã¡ã€ã³ããŒãžã«ã¯route /çµç±ã§ã¢ã¯ã»ã¹ã§ããææ°ã®ããã°ãšã³ããªã衚瀺ããå¿ èŠãããããšãããã£ãŠããŸãã æ°ããtestIndexïŒïŒã¡ãœãããPageControllerTestã¯ã©ã¹ã«è¿œå ããŸã
src / Blogger / BlogBuâândle / Tests / Controller / PageControllerTest.php
// src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php public function testIndex() { $client = static::createClient(); $crawler = $client->request('GET', '/'); // Check there are some blog entries on the page $this->assertTrue($crawler->filter('article.blog')->count() > 0); }
aboutããŒãžã®ãã¹ããšåãæé ãèŠãããšãã§ããŸãã ãã¹ããå®è¡ããŠããã¹ãŠãæ£ããæ©èœããŠããããšã確èªããŸãã
$ phpunit -c app/ src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php
ããå°ãå ã«é²ã¿ãŸãããã æ©èœãã¹ãã®äžéšã«ã¯ããŠãŒã¶ãŒããµã€ãã§è¡ãããšãç¹°ãè¿ãæ©èœãå«ãŸããŸãã ãµã€ãã®ããŒãžãããã²ãŒãããã«ã¯ããŠãŒã¶ãŒããªã³ã¯ãã¯ãªãã¯ããŸãã ãã®ã¢ã¯ã·ã§ã³ãã·ãã¥ã¬ãŒãããŠãã¿ã€ãã«ãã¯ãªãã¯ããããšãã«èšé²ããŒãžãžã®ãªã³ã¯ã®æ£ç¢ºæ§ã確èªããŸãããã
PageControllerTestã¯ã©ã¹ã®testIndexïŒïŒã¡ãœãããæŽæ°ãã
// src / Blogger / BlogBuâândle / Tests / Controller / PageControllerTest.php
ãããªãã¯é¢æ°testIndexïŒïŒ
{
// ...
//æåã®ãªã³ã¯ãèŠã€ããŠã¿ã€ãã«ãååŸããããã次ã®ããŒãžã«ããŒããããŠããããšã確èªããŸã
$ blogLink = $ crawler-> filterïŒ 'article.blog h2 a'ïŒ-> firstïŒïŒ;
$ blogTitle = $ blogLink-> textïŒïŒ;
$ crawler = $ client-> clickïŒ$ blogLink-> linkïŒïŒïŒ;
// h2ã«ããã°ã¿ã€ãã«ãå«ãŸããŠããããšã確èªããŸã
$ this-> assertEqualsïŒ1ã$ crawler-> filterïŒ 'h2ïŒcontainsïŒ "'ã$ blogTitleã '"ïŒ'ïŒ-> countïŒïŒïŒ;
}
ãããªãã¯é¢æ°testIndexïŒïŒ
{
// ...
//æåã®ãªã³ã¯ãèŠã€ããŠã¿ã€ãã«ãååŸããããã次ã®ããŒãžã«ããŒããããŠããããšã確èªããŸã
$ blogLink = $ crawler-> filterïŒ 'article.blog h2 a'ïŒ-> firstïŒïŒ;
$ blogTitle = $ blogLink-> textïŒïŒ;
$ crawler = $ client-> clickïŒ$ blogLink-> linkïŒïŒïŒ;
// h2ã«ããã°ã¿ã€ãã«ãå«ãŸããŠããããšã確èªããŸã
$ this-> assertEqualsïŒ1ã$ crawler-> filterïŒ 'h2ïŒcontainsïŒ "'ã$ blogTitleã '"ïŒ'ïŒ-> countïŒïŒïŒ;
}
æåã«è¡ãããšã¯ãã¯ããŒã©ãŒã䜿çšããŠãæçš¿ã¿ã€ãã«ã®æåã®ãªã³ã¯ããããã¹ããæœåºããããšã§ãã ããã¯ã article.blog h2 a filterã䜿çšããŠè¡ãããŸãã ãã®ãã£ã«ã¿ãŒã¯ã article.blogèšäºã®H2ã¿ã°å ã®ã¿ã°ãè¿ãããã«äœ¿çšãããŸãã ãããããããç解ããã«ã¯ããšã³ããªãŒã衚瀺ããããã«ããŒã ããŒãžã§äœ¿çšãããããŒã¯ã¢ãããèŠãŠãã ããã
<article class="blog"> <div class="date"><time datetime="2016-06-17T14:23:55+03:00">Friday, June 17, 2016</time></div> <header> <h2><a href="/1/a-day-with-symfony2">A day with Symfony2</a></h2> </header> //.. </article>
article.blog h2ã®æ§é ã¯ãããŒã ããŒãžã®ã¬ã€ã¢ãŠãã®ãã£ã«ã¿ãŒã§ç¢ºèªã§ããŸãã ãŸããããŒã¯ã¢ããã«äžéšãããããšã«ãæ°ä»ãã§ããããã€ãŸããã¯ããŒã©ãŒãã£ã«ã¿ãŒã¯ã³ã¬ã¯ã·ã§ã³ãè¿ããŸãã æåã®ãªã³ã¯ã®ã¿ãå¿ èŠãªã®ã§ãã³ã¬ã¯ã·ã§ã³ã®æåã®ïŒïŒã¡ãœããã䜿çšããŸãã clickïŒïŒã¡ãœããã¯ãªã³ã¯ãªããžã§ã¯ããåãåããCrawlerã€ã³ã¹ã¿ã³ã¹ã§å¿çãè¿ããŸãã Crawlerãªããžã§ã¯ããæ©èœãã¹ãã®éèŠãªèŠçŽ ã§ããããšã«æ°ä»ãã§ãããã
ããã§ãCrawlerãªããžã§ã¯ãã«ããã°ããŒãžã®å¿çãå«ãŸããŸãã ãªã³ã¯ãç®çã®ããŒãžã«ãªãã€ã¬ã¯ããããããšããã¹ãããå¿ èŠããããŸãã åã«æœåºãã$ blogTitleå€ã䜿çšããŠãå¿çã®ã¿ã€ãã«ã確èªã§ããŸãã
ãã¹ããå®è¡ããŠãããŒã ããŒãžãšæçš¿ããŒãžéã®ããã²ãŒã·ã§ã³ãæ£ããæ©èœããããšã確èªããŸãã
$ phpunit -c app/ src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php
æ©èœãã¹ãäžã«ãµã€ãã®ããŒãžãããã²ãŒãããæ¹æ³ãç解ããã®ã§ããã©ãŒã ã®ãã¹ãã«ç§»ããŸãããã
é£çµ¡å ããŒãžã®ãã¹ã
SymblogãŠãŒã¶ãŒã¯ãé£çµ¡å ããŒãžhttpïŒ// localhostïŒ8000 / contactã®ãã©ãŒã ã«èšå ¥ããŠãé£çµ¡å ãªã¯ãšã¹ããéä¿¡ã§ããŸããã¯ãšãªãæ£ããæ©èœããããšããã¹ãããŠã¿ãŸããããæåã«ããã©ãŒã ãæ£åžžã«éä¿¡ããããšãã«äœãèµ·ãããã決å®ããå¿ èŠããããŸãïŒãã®å Žåãæ£åžžã«éä¿¡ããããšã¯ããšã©ãŒã®ãªããã©ãŒã ãæå³ããŸãïŒã
é£çµ¡å ããŒãžã«ç§»åããŸãã
ãã©ãŒã ã«ããŒã¿ãå ¥åããŸãããã©ãŒã ã
éä¿¡ããŸãã
ã¬ã¿ãŒãéä¿¡ãããããšã
確èªããŸããéä¿¡ãæåããããšã確èªã
ãŸãã
é 眮ãããPageControllerTestã¯ã©ã¹ã«æ°ããtestContactïŒïŒã¡ãœãããè¿œå ããŸã
src / Blogger / BlogBuâândle / Tests / Controller / PageControllerTest.php
// src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php public function testContact() { $client = static::createClient(); $crawler = $client->request('GET', '/contact'); $this->assertEquals(1, $crawler->filter('h1:contains("Contact symblog")')->count()); // Select based on button value, or id or name for buttons $form = $crawler->selectButton('Submit')->form(); $form['contact[name]'] = 'name'; $form['contact[email]'] = 'email@email.com'; $form['contact[subject]'] = 'Subject'; $form['contact[body]'] = 'The comment body must be at least 50 characters long as there is a validation constrain on the Enquiry entity'; $crawler = $client->submit($form); $this->assertEquals(1, $crawler->filter('.blogger-notice:contains("Your contact enquiry was successfully sent. Thank you!")')->count()); }
url / contactãªã¯ãšã¹ãã§éå§ããããŒãžã«æ£ããH1ããããŒãå«ãŸããŠããããšã確èªããŸãã次ã«ãã¯ããŒã©ãŒã䜿çšããŠéä¿¡ãã¿ã³ãéžæããŸãããã©ãŒã ã§ã¯ãªããã¿ã³ãéžæããçç±ã¯ããã©ãŒã ã«è€æ°ã®ãã¿ã³ãå«ãŸããŠããå Žåããããããããäºãã«ç¬ç«ããŠã¯ãªãã¯ããå Žåãããããã§ããéžæãããã¿ã³ãããã©ãŒã ãååŸã§ããŸãã[]é åã䜿çšããŠãã©ãŒã ã®å€ãèšå®ã§ããŸããæåŸã«ããã©ãŒã ã¯ã¯ã©ã€ã¢ã³ãã®submitïŒïŒã¡ãœããã«éä¿¡ããããã©ãŒã ãéä¿¡ããŸãããã€ãã®ããã«ãCrawlerã€ã³ã¹ã¿ã³ã¹ãååŸããŸããã¯ããŒã©ãŒã®å¿çã䜿çšããŠãè¿ãããå¿çã«ãã©ãã·ã¥ã¡ãã»ãŒãžãååšããããšã確èªããŸãããã¹ããå®è¡ããŠããã¹ãŠãæ£åžžã«æ©èœããŠããããšã確èªããŸãã
$ phpunit -c app/ src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php
ãã¹ãã¯å€±æããŸããã 次ã®PHPUnitã¡ãã»ãŒãžãåãåããŸã
1) Blogger\BlogBundle\Tests\Controller\PageControllerTest::testContact Failed asserting that 0 matches expected 1. D:\local\symfony-blog\src\Blogger\BlogBundle\Tests\Controller\PageControllerTest.php:55 FAILURES! Tests: 3, Assertions: 5, Failures: 1.
çµè«ã¯ããã©ãŒã ãéä¿¡ãããåŸã®å¿çã§ãã©ãã·ã¥ã¡ãã»ãŒãžãèŠã€ãããªãããšã瀺ããŠããŸããããã¯ããã¹ãç°å¢ã«ãããšãã«ãªãã€ã¬ã¯ããå®è¡ãããªãããã«çºçããŸããã PageControllerã¯ã©ã¹ã§ãã©ãŒã ãæ£åžžã«æ€èšŒããããšããªãã€ã¬ã¯ããçºçããŸãããã®ãªãã€ã¬ã¯ãã¯çºçããŸãããå°éããå¿ èŠãããããšãæ瀺çã«ç€ºãå¿ èŠããããŸãããªãã€ã¬ã¯ããå®è¡ãããªãçç±ã¯ãçŸåšã®å¿çãæåã«ç¢ºèªããå¿ èŠãããå¯èœæ§ããããããåçŽã§ããããã¯ãåŸã§ã¡ãã»ãŒãžãéä¿¡ããããã©ããã確èªãããšãã«è¡šç€ºãããŸãã PageControllerTestã¯ã©ã¹ãæŽæ°ããŠããªãã€ã¬ã¯ããèšå®ããŸãã
// src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php public function testContact() { // .. $crawler = $client->submit($form); // Need to follow redirect $crawler = $client->followRedirect(); $this->assertEquals(1, $crawler->filter('.blogger-notice:contains("Your contact enquiry was successfully sent. Thank you!")')->count()); }
ããã§ãPHPUnitãã¹ããå®è¡ããå Žåããããã«åæ Œããå¿ èŠããããŸãã次ã«ãé£çµ¡å ãã©ãŒã ã®éä¿¡ããã»ã¹ããã§ãã¯ããæçµæ®µéãã¹ããã4ãã¡ãŒã«ãéä¿¡ãããããšã確èªããŸãã次ã®æ§æãåå ã§ããã¹ãç°å¢ã§ã¡ãŒã«ãé ä¿¡ãããªãããšããã§ã«ããã£ãŠããŸãã
# app/config/config_test.yml swiftmailer: disable_delivery: true
Webãããã¡ã€ã©ãŒãéããŠåéãããæ å ±ã䜿çšããŠãé»åã¡ãŒã«ãéä¿¡ãããããšã確èªã§ããŸããããã§ãã¯ã©ã€ã¢ã³ãããªãã€ã¬ã¯ãããªãããšãéèŠã§ãããããã¡ã€ã©ãŒã®æ€èšŒã¯ããªãã€ã¬ã¯ããçºçããåã«è¡ãå¿ èŠããããŸããããããªããšããããã¡ã€ã©ãŒå ã®æ å ±ã倱ãããŸãã
testContactïŒïŒã¡ãœãããæŽæ°ãã
// src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php public function testContact() { // .. $crawler = $client->submit($form); // Check email has been sent if ($profile = $client->getProfile()) { $swiftMailerProfiler = $profile->getCollector('swiftmailer'); // Only 1 message should have been sent $this->assertEquals(1, $swiftMailerProfiler->getMessageCount()); // Get the first message $messages = $swiftMailerProfiler->getMessages(); $message = array_shift($messages); $symblogEmail = $client->getContainer()->getParameter('blogger_blog.emails.contact_email'); // Check message is being sent to correct address $this->assertArrayHasKey($symblogEmail, $message->getTo()); } // Need to follow redirect $crawler = $client->followRedirect(); $this->assertTrue($crawler->filter('.blogger-notice:contains("Your contact enquiry was successfully sent. Thank you!")')->count() > 0); }
ãã©ãŒã ãéä¿¡ããåŸãçŸåšã®ç°å¢ã®æ§æã䜿çšããŠãããã¡ã€ã©ãŒãç¡å¹ã«ã§ããããããããã¡ã€ã©ãŒã䜿çšå¯èœãã©ããã確èªããŸãã
ãã³ã
ãã¹ãã¯ãã¹ãç°å¢ã§å®è¡ããã®ã§ã¯ãªãããããã¡ã€ã©ãŒãªã©ãå©çšã§ããªãæ¬çªç°å¢ã§å®è¡ããå¿ èŠãããããšã«æ³šæããŠãã ããã
ãããã¡ã€ã©ãŒãååŸã§ããå Žåã¯ãswiftmailerã³ã¬ã¯ã¿ãŒãååŸãããªã¯ãšã¹ããäœæããŸããswiftmailerã³ã¬ã¯ã¿ãŒã¯èå°è£ã§åããé»åã¡ãŒã«ãµãŒãã¹ã®äœ¿çšæ¹æ³ã«é¢ããæ å ±ãåéããŸããããã䜿çšããŠãéä¿¡ãããæçŽã«é¢ããæ å ±ãååŸã§ããŸãã
次ã«ãgetMessageCountïŒïŒã¡ãœããã䜿çšããŠã1ã€ã®é»åã¡ãŒã«ãéä¿¡ãããããšã確èªããŸããããã¯ãã¡ãŒã«ãéä¿¡ãããããšã確èªããã«ã¯ååã§ãããã¡ãŒã«ãé©åãªå Žæã«éä¿¡ãããããšã確èªããŸããã
ããã§ãã¹ããåéãããã¹ãŠãæ£åžžã«æ©èœããŠããããšã確èªããŸãã
$ phpunit -c app/ src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php
è¿œå ã³ã¡ã³ãã®ãã¹ã
次ã«ãé£çµ¡å æ å ±ããŒãžã®ä»¥åã®ãã¹ãã§åŸãããç¥èã䜿çšããŠãæçš¿ã«ã³ã¡ã³ããè¿œå ããããã»ã¹ããã¹ãããŸããããç¹°ãè¿ããŸããããã©ãŒã ãæ£åžžã«éä¿¡ããããšãã«äœãèµ·ããã¹ãããæŠèª¬ããŸãã
ããŒãžã®èšé²ãžã®ç§»è¡
ããããã®ãã©ãŒã ãèšå ¥
ãã©ãŒã éä¿¡
ã³ã¡ã³ããã¹ãŠã®ã³ã¡ã³ãã®æåŸã«è¿œå ãããããšã確èªã
ãææ°ã®ã³ã¡ã³ãïŒã³ã¡ã³ããªã¹ãã®æåã®ãã®ãïŒãã§ãã¯ãããµã€ãããŒã®ãããã¯ã
äžã«æ°ãããã¡ã€ã«ãäœæããŸãã
src / Blogger / BlogBuâândle / Tests / Controller / BlogControllerTest.php
<?php // src/Blogger/BlogBundle/Tests/Controller/BlogControllerTest.php namespace Blogger\BlogBundle\Tests\Controller; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class BlogControllerTest extends WebTestCase { public function testAddBlogComment() { $client = static::createClient(); $crawler = $client->request('GET', '/1/a-day-with-symfony'); $this->assertEquals(1, $crawler->filter('h2:contains("A day with Symfony2")')->count()); // Select based on button value, or id or name for buttons $form = $crawler->selectButton('Submit')->form(); $crawler = $client->submit($form, array( 'blogger_blogbundle_commenttype[user]' => 'name', 'blogger_blogbundle_commenttype[comment]' => 'comment', )); // Need to follow redirect $crawler = $client->followRedirect(); // Check comment is now displaying on page, as the last entry. This ensure comments // are posted in order of oldest to newest $articleCrawler = $crawler->filter('section .previous-comments article')->last(); $this->assertEquals('name', $articleCrawler->filter('header span.highlight')->text()); $this->assertEquals('comment', $articleCrawler->filter('p')->last()->text()); // Check the sidebar to ensure latest comments are display and there is 10 of them $this->assertEquals(10, $crawler->filter('aside.sidebar section')->last() ->filter('article')->count() ); $this->assertEquals('name', $crawler->filter('aside.sidebar section')->last() ->filter('article')->first() ->filter('header span.highlight')->text() ); } }
ã³ãŒãã®èª¿æ»ãéå§ããåã«ããã®ãã¡ã€ã«ã®ãã¹ããå®è¡ããŠããã¹ãŠãæ£åžžã«æ©èœããŠããããšã確èªããŸãã
$ phpunit -c app/ src/Blogger/BlogBundle/Tests/Controller/BlogControllerTest.php
PHPUnitã¯ã1ã€ã®ãã¹ããæåããããšãéç¥ããå¿ èŠããããŸããtestAddBlogCommentïŒïŒã®ã³ãŒããèŠããšãã¯ã©ã€ã¢ã³ãã®äœæãããŒãžã®ãªã¯ãšã¹ããããã³ãã®æ€èšŒã確èªã§ããŸãã次ã«ãã³ã¡ã³ãã®è¿œå ãã©ãŒã ãåä¿¡ãããã©ãŒã ãéä¿¡ããŸãããã©ãŒã ã®å€ãå ¥åããæ¹æ³ã¯ã以åã®ããŒãžã§ã³ãšã¯å°ãç°ãªããŸããä»åã¯submitïŒïŒã¡ãœããã®2çªç®ã®ã¯ã©ã€ã¢ã³ãåŒæ°ã䜿çšããŠãã©ãŒã å€ãè¿œå ããŸãã
ãã³ã
ãªããžã§ã¯ãæåã®ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠããã©ãŒã ãã£ãŒã«ãã®å€ãèšå®ããããšãã§ããŸãã以äžã«äŸã瀺ããŸãã
// Tick a checkbox $form['show_emal']->tick(); // Select an option or a radio $form['gender']->select('Male');
ãã©ãŒã ãéä¿¡ããåŸãå¿çã確èªã§ããããã«ãªãã€ã¬ã¯ãã«åŸãå¿ èŠãããã¯ã©ã€ã¢ã³ãããªã¯ãšã¹ãããŸããã¯ããŒã©ãŒãåã³äœ¿çšããŠãææ°ã®ããã°ã³ã¡ã³ããååŸããŸããæåŸã«ããµã€ãããŒã®ææ°ã®ã³ã¡ã³ãããã§ãã¯ããŠãã³ã¡ã³ãããªã¹ãã®æåã§ããããšã確èªããŸãã
ããã°ãªããžããª
æ©èœãã¹ãã®æåŸã®éšåã§ã¯ãDoctrine 2ãªããžããªã®ãã¹ãã調ã¹ãŸããæ°ãããã¡ã€ã«ãäœæãã
src / Blogger / BlogBuâândle /ãã¹ã/ãªããžããª/ BlogRepositoryTest.php
<?php // src/Blogger/BlogBundle/Tests/Repository/BlogRepositoryTest.php namespace Blogger\BlogBundle\Tests\Repository; use Blogger\BlogBundle\Entity\Repository\BlogRepository; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class BlogRepositoryTest extends WebTestCase { /** * @var \Blogger\BlogBundle\Entity\Repository\BlogRepository */ private $blogRepository; public function setUp() { $kernel = static::createKernel(); $kernel->boot(); $this->blogRepository = $kernel->getContainer() ->get('doctrine.orm.entity_manager') ->getRepository('BloggerBlogBundle:Blog'); } public function testGetTags() { $tags = $this->blogRepository->getTags(); $this->assertTrue(count($tags) > 1); $this->assertContains('symblog', $tags); } public function testGetTagWeights() { $tagsWeight = $this->blogRepository->getTagWeights( array('php', 'code', 'code', 'symblog', 'blog') ); $this->assertTrue(count($tagsWeight) > 1); // Test case where count is over max weight of 5 $tagsWeight = $this->blogRepository->getTagWeights( array_fill(0, 10, 'php') ); $this->assertTrue(count($tagsWeight) >= 1); // Test case with multiple counts over max weight of 5 $tagsWeight = $this->blogRepository->getTagWeights( array_merge(array_fill(0, 10, 'php'), array_fill(0, 2, 'html'), array_fill(0, 6, 'js')) ); $this->assertEquals(5, $tagsWeight['php']); $this->assertEquals(3, $tagsWeight['js']); $this->assertEquals(1, $tagsWeight['html']); // Test empty case $tagsWeight = $this->blogRepository->getTagWeights(array()); $this->assertEmpty($tagsWeight); } }
ããŒã¿ããŒã¹ãžã®æ£ããæ¥ç¶ãå¿ èŠãšãããã¹ããå®è¡ãããã®ã§ãSymfony2 KernelãããŠã³ããŒãã§ãããããWebTestCaseãå床æ¡åŒµããŸãã次ã®ã³ãã³ãã§ãã®ãã¡ã€ã«ã®ãã¹ããå®è¡ããŸãã
$ phpunit -c app/ src/Blogger/BlogBundle/Tests/Repository/BlogRepositoryTest.php
ã³ãŒãã«ãã¬ããž
ã³ãŒãã«ãã¬ããžã«ããããã¹ãã®å®è¡æã«ã³ãŒãã®ã©ã®éšåãå®è¡ãããããããããŸããããã«ããããã¹ãã§ã«ããŒãããŠããªãã³ãŒãéšåã確èªãããããã®ãã¹ããäœæãããã©ããã決å®ã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã«ãã¬ããžã衚瀺ããã«ã¯ãã³ã³ãœãŒã«ã«å ¥åããŸã
$ phpunit --coverage-html ./phpunit-report -c app/
ã³ãã³ããæ©èœããããšãèŠããŠãããŠãã ãããphpã§xdebugãæå¹ã«ããå¿ èŠããããŸãã
ããã«ããããããžã§ã¯ãã«ãŒãã®phpunit-reportãã©ã«ããŒã«ã³ãŒãã«ãã¬ããžåæãåºåãããŸãããã©ãŠã¶ãŒã§ãã®ãã©ã«ããŒããindex.htmlãã¡ã€ã«ãéããåæçµæã確èªããŸãã
ãããã«
ãã¹ãã§ã¯ãããã€ãã®éèŠãªé åã調æ»ããŸããããŠããããã¹ããšæ©èœãã¹ãã®äž¡æ¹ã調ã¹ãŠããµã€ããé©åã«æ©èœããŠããããšã確èªããŸããããã©ãŠã¶ã®ãªã¯ãšã¹ããã·ãã¥ã¬ãŒãããæ¹æ³ãšãSymfony2 Crawlerã¯ã©ã¹ã䜿çšããŠãããã®ãªã¯ãšã¹ãã®ã¬ã¹ãã³ã¹ãæ€èšŒããæ¹æ³ãèŠãŸããã
ãœãŒã¹ãšãµããŒãè³æïŒ
https : //symfony.com/
http://tutorial.symblog.co.uk/
https://phpunit.de/
ãã¹ãå°æ¬
ãããžã§ã¯ãã«å¯ãããã泚æãšã³ã¡ã³ãã«æè¬ããŸããåé¡ã質åãããå Žåã¯ãã³ã¡ã³ãããã©ã€ããŒãã¡ãã»ãŒãžã®è³Œèªã解é€ããåéãšããŠè¿œå ããŠãã ããã
ããŒã1-Symfony2ãšãã³ãã¬ãŒãã®æ§æ
ããŒã2-é£çµ¡å ããŒãžïŒããªããŒã¿ãŒããã©ãŒã ãããã³ã¡ãŒã«
ããŒã3-Doctrine 2ãšããŒã¿ãã£ã¯ã¹ãã£
ããŒã4-Doctrine 2ã®ã³ã¡ã³ãã¢ãã«ããªããžããªã移è¡
ããŒã5-Twigæ¡åŒµããµã€ãããŒãããã³è³ç£
ãŸããããã¥ã¢ã«ãæ°ã«å ¥ã£ããããããžã§ã¯ããªããžããªã«ã¹ã¿ãŒãä»ãããã賌èªããããšãã§ããŸããããããšã