12

Symfony の twig テンプレートの継続的統合について考え始めました。

  1. テンプレートは独立したロジックです。
  2. テンプレートに誤りがあります。しかし、開発の過程で目視検査に気を取られたくありません。

Symfony で小枝ファイルを単体テストするための既製のソリューションはありますか?

4

4 に答える 4

8

小枝テンプレート内の構文エラーのテスト:

コマンドラインを使用して、すべての twig テンプレートを 1 つのバンドルにテストするには、次を使用します。

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
于 2013-11-11T10:20:30.413 に答える
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 テンプレート ファイルと、パラメーターとして渡されたrenderさまざまなオブジェクトを読み込むことができます。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 行目のシェル コマンドに注意してください。Twig 環境はそのテンプレート ファイルをキャッシュします。信頼性の高いテストを実行するには、各テストを実行する前にキャッシュの場所を消去する必要があります。

`rm -rf /var/tmp/journeymonitor-twig-tests-cache`;
`mkdir -p /var/tmp/journeymonitor-twig-tests-cache`;
于 2016-01-27T07:27:29.753 に答える
2

symfony を使用して、次のように個々の twig ファイルをテストします。

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

OK の場合の結果:

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

OKでない場合の結果(属していない場所に中括弧を追加しました):

/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() 
于 2013-12-16T18:53:08.313 に答える