問題
LaravelのHTTPテストで、assertSeeやassertSeeTextを使って、HTMLの中に特定の文字列が含まれていることをテストすることがあります。
しかし、デフォルトでは、これらのメソッドはHTMLエスケープされた文字列を検索するため、意図した通りにテストが通らないことがあります。
例えば、次のようなコードを書いて、HTMLの中に<h1>hello</h1>
の文字があるかどうかをテストすると、失敗します。
// コントローラーのサンプルアクション
public function index() {
return view('welcome', ['message' => '<h1>hello</h1>']);
}
// テストケース
public function testExample() {
$this->get('/')
->assertSee('<h1>hello</h1>');
}
この失敗の理由は、assertSee メソッドがデフォルトでHTMLエスケープされた文字列を検索するためです。
解決策
この問題に対処するには、assertSee
やassertSeeText
メソッドに第二引数としてfalse
を渡します。
これにより、メソッドはHTMLエスケープされた文字列の検索を行わなくなり、生のHTMLタグの存在を確認できるようになります。
// テストケース
public function testExample() {
$this->get('/')
->assertSee('<h1>hello</h1>', false);
}
この変更により、LaravelはHTMLタグをエスケープせずにそのままの形でテスト対象の文字列として認識し、期待通りのテスト結果を得ることができます。