PHPUnit には、AssertSee や AssertSeeText などの機能が付属しており、どちらの場合も特定のテキストに対してアサートでき、HTML タグをアサートするには、いくつかのカスタム機能を使用してこれらの機能に依存します。これらをもう少し磨くように努めます。
一部のフォームが CSRF トークンを生成することをテストする必要があります。
Laravel CSRF トークン ディレクティブは次のような入力を生成します:
<input type="hidden" name="_token" value="random_generated_token" ...>
生成されたトークンはリクエスト間で変化するため、生成されたトークン値をテストするつもりはありません。代わりに、必要な属性の一部を備えた入力が存在することをアサートします。PHPUnitassertSee には値をエスケープするための 2 番目のパラメータがあるため、次のようなことをしてください:
$this ->get("contact-us") ->assertSee([ '<input name="some_database_column"' ], false);
これで解決策は解決しますが、おそらく、より多くの場合にこれを使用するより良い方法があるので、「希望的観測」アプローチを使用して書くと、私の目的のコードは次のようになります。
$this->get("contact-us") ->assertHtml('input', [ "type" => "hidden", "name" => "_token", ])
これは、タグ名と属性の配列を渡すだけで複数のケースで機能するアサーションを追加するので便利です
AppServiceProvider またはその他のカスタム プロバイダーの TestResponse クラスにカスタム マクロを追加することで、Laravel に次のようなものを追加できます。
TestResponse::macro('assertHtml', function ($tag, $attributes) { $attributes = collect($attributes) ->map(function ($attributeValue, $attributeKey) { return "$attributeKey=\"$attributeValue\" "; }) ->values() ->implode("", ""); $htmlElement = "<$tag $attributes"; $this->assertSee([$htmlElement], false); });
これで、タグと属性の存在をテストして DOM をテストできるようになりました。
この場合、少し先に進むことができます。アプリ内の複数のフォームでフォームを CSRF トークンとしてアサートする必要があるため、マクロを利用してさらに多くのアサーションを作成できます。この場合は予想どおりです。 HTML タグと属性は変更されません。次のようなものを追加できます:
TestResponse::macro('assertCSRFTokenExists', function () { $this->assertHtml('input', [ "type" => "hidden", "name" => "_token", ]); });
このアサーションは短く、再利用可能で、読みやすく、使いやすいです:
$this->get("contact-us")->assertCSRFTokenExists();
より強力なアサーションについては、次のような優れたパッケージを検討する必要があります。
sinnbeck/laravel-dom-assertions
これがテストに基本的な DOM アサーションを追加するのに役立つことを願っています
以上がPHPUnit を使用して Laravel で DOM をテストするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。