树枝模板单元测试

non*_*lux 7 php continuous-integration symfony twig

我开始考虑Symfony中的twig模板的持续集成.

  1. 模板是独立的逻辑.
  2. 模板中存在错误.但在开发过程中,我不想被视觉检查分散注意力.

是否有任何现成的解决方案可以在交响乐中对twig文件进行单元测试?

ahm*_*mdy 7

在twig模板中测试语法错误:

您可以使用命令行通过使用以下方法将所有树枝模板测试到一个Bundle中:

php app/console twig:lint @name of Bundle
Run Code Online (Sandbox Code Playgroud)

例:

php app/console twig:lint @AcmeDemoBundle
Run Code Online (Sandbox Code Playgroud)

结果将是:

如果没有任何语法错误:

OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/layout.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Demo/hello.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Demo/contact.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Demo/index.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Secured/layout.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Secured/login.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Secured/helloadmin.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Secured/hello.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig
Run Code Online (Sandbox Code Playgroud)

如果存在语法错误,它将检测行中的语法错误以及语法错误的原因:

OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/layout.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Demo/hello.html.twig
KO in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Demo/contact.html.twig (line 6)
   4      
   5      {% block content %}
>> 6          <form action="{{ ath('_demo_contact') }}" method="POST" id="contact_form">
>> The function "ath" does not exist. Did you mean "path", "logout_path" 
   7              {{ form_errors(form) }}
   8      
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Demo/index.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Secured/layout.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Secured/login.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Secured/helloadmin.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Secured/hello.html.twig
OK in /var/www/SymBlog/src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig
Run Code Online (Sandbox Code Playgroud)


Man*_*ing 6

除了通过lint来验证Twig模板文件的结构和语法正确性之外,您还可以对Twig模板的逻辑进行单元测试.

例如,您可以验证if-elseif-else-endif构造的正确行为,并且可以单独执行此操作,也就是说,无需通过具有所有依赖项的控制器.

请查看https://github.com/journeymonitor/control/blob/2645c69/src/AppBundle/Resources/views/testcases/_testresults-overview-testresult-label.html.twig.这是一个非常简单的模板,但它确实有一些行为 - 取决于值testresult.exitCode,必须输出不同的标签名称.

https://github.com/journeymonitor/control/blob/bc42e78/tests/AppBundle/Resources/views/testcases/_testresults-overview-testresult-label.html.twig.test.php,您可以看到单元测试用例这个模板.

测试用例设置了一个新的Twig_Environment,它允许您加载Twig模板文件,并将renderTestresult作为参数传入不同的对象.然后可以像在任何其他PHPUnit测试中一样声明渲染操作的结果:

$loader = new Twig_Loader_Filesystem(__DIR__ . '/../../../../../src/AppBundle/Resources/views/testcases/');
$twig = new Twig_Environment($loader, array(
    'cache' => '/var/tmp/journeymonitor-twig-tests-cache',
));
$template = $twig->loadTemplate('_testresults-overview-testresult-label.html.twig');

$testresult = new \AppBundle\Entity\Testresult();
$testresult->setExitCode(0);

$this->assertSame('success', $template->render(['testresult' => $testresult]));
Run Code Online (Sandbox Code Playgroud)

注意第8行和第9行的shell命令--Twig环境缓存其模板文件,为了进行可靠的测试,您需要确保在每次测试运行之前擦除缓存位置:

`rm -rf /var/tmp/journeymonitor-twig-tests-cache`;
`mkdir -p /var/tmp/journeymonitor-twig-tests-cache`;
Run Code Online (Sandbox Code Playgroud)


max*_*ver 4

WebTestCase在(自 Symfony 2.0 以来的 phpunit 扩展TestCase)/ (自 Symfony 2.5 以来KernelTestCasephpunit 的扩展)内部TestCase

    $twig = self::$kernel->getContainer()->get('twig');
    $html = $twig->render('AppBundle::app/something.html.twig', ['content' => 'I am some variable value']);
    self::assertEquals($html, $response->getContent());
Run Code Online (Sandbox Code Playgroud)