Twig模板单元测试

12

我开始考虑在Symfony中对twig模板进行持续集成。

  1. 一个模板是独立的逻辑。
  2. 模板中可能会有错误。但在开发过程中,我不想被视觉检查分心。

在Symfony中有没有现成的解决方案来对twig文件进行单元测试?


你能明确说一下你指的是哪些问题吗?是模板的单元测试吗?还有其他什么问题吗? - cmt
我想要实现对模板的全面检查。 验证模板的语法错误、扩展的正确使用等。检查模板的逻辑。对于逻辑检查,我想使用单元测试。但是对于验证,我可能会使用类似于lint的其他工具。 - nonlux
1
Twig lint已经存在。在Symfony2中,您可以运行php app/console twig:lint <file> - cmt
你可能想要了解一下功能测试,通过它你可以测试在给定输入的情况下是否能够获得正确的输出。 - Maerlyn
4个回答

8

测试twig模板内的语法错误:

您可以使用命令行对一个Bundle中的所有twig模板进行测试:

php app/console twig:lint @name of Bundle

例子:

php app/console twig:lint @AcmeDemoBundle

结果将是:
如果没有任何语法错误:
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

如果有语法错误,它将检测到语法错误所在的行以及语法错误的原因:

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

IDE不应该实时直接显示这样的错误吗? - Guntram
这取决于你使用的集成开发环境(IDE)以及是否打开了语法检查。例如,我使用phpstorm,在庞大的Twig模板中有时必须关闭语法检查,因为它需要比我拥有的更多的内存:( - Diguin

7
除了通过对Twig模板文件进行lint检查来验证其结构和语法的正确性之外,您还可以通过单元测试来验证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模板文件并将其渲染为传递的不同Testresult对象。然后可以像任何其他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]));

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

`rm -rf /var/tmp/journeymonitor-twig-tests-cache`;
`mkdir -p /var/tmp/journeymonitor-twig-tests-cache`;

看起来你需要使用$twig-addExtension(),才能让Symfony路由和额外的内容在解析时不出错。我还没有成功地让它工作起来。但我认为这是我需要走的路线(无意冒犯),以便测试我的twig文件。 - tlorens

4
在 Symfony 2.0 以后,WebTestCase 成为 phpunit TestCase 的扩展,而在 Symfony 2.5 以后,KernelTestCase 成为 phpunit 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());

2

使用Symfony测试单个Twig文件的方法如下:

./app/console twig:lint /yourproject/yourtwigs/views/yourtwig.html.twig

如果一切正常,结果如下:

OK in /yourproject/yourtwigs/views/yourtwig.html.twig

如果不正确,结果如下(我在错误的位置添加了一个花括号):

/yourproject/yourtwigs/views/yourtwig.html.twig (line 2)
   1      {% include 'YourBundle:Includes:jquery.html.twig' %} 
>> 2      {{% include 'YourBundle:Includes:datatables.html.twig' %}
>> Unexpected "}" 
   3      <script>
   4      $(document).ready(function() 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接