ブラウザテスト(Laravel Dusk) 5.6 Laravel#使用可能なアサート
Laravelの自動ブラウザテスト機能duskでは多くのassertが使用可能です。多くのassertが使用可能ですがいずれもブラウザ上で何かを確認するためのassertです。duskは単一責任の原則を守りきれいに作られています。時にはブラウザ上の操作の結果データベース上の値がどうなったかを確認するケースの様にブラウザを介さないassertを実行したい場合があります。このためにduskで使用するコード中にduskを飛び越してduskの使っているPHPUnitにアクセスするコードを埋め込みます。
duskの使用可能なアサートはだいたい次の様なコードで作られています。
use PHPUnit\Framework\Assert as PHPUnit;
/* 省略 */
/**
* Assert that the given text appears within the given selector.
*
* @param string $selector
* @param string $text
* @return $this
*/
public function assertSeeIn($selector, $text)
{
$fullSelector = $this->resolver->format($selector);
$element = $this->resolver->findOrFail($selector);
PHPUnit::assertTrue(
Str::contains($element->getText(), $text),
"Did not see expected text [{$text}] within element [{$fullSelector}]."
);
return $this;
}
与えられたセレクタに従った要素中に与えられたtextが存在しないならばエラーというassertTrueを呼び出しています。このコード同様にPHPUnit\Framework\Assertからより素朴なassert関数を呼び出すことによってより自由度の高いテストをすることが出来ます。もちろんエラーが起きた際、ログやコンソールにエラーが起きたコード中の場所とエラーメッセージが表示されます。
/**
* 契約取消しテスト
* @param Browser $browser
* @throws \Facebook\WebDriver\Exception\TimeOutException
*/
private function cancelContractTest(Browser $browser)
{
$browser->//省略
$member = Members::find($this->member_key);
PHPUnit::assertTrue(is_null($member->contract), "exist expected null contract.");
$this->assertSeeMemberType($browser, $member);
}
最近書いたコードではこのようなものを書きました。これは、契約取消し操作をしたならばmemberはcontractを持っていないはず、というテストでした。
duskは見事にSeleniumとPHPUnitを繋げて分かりやすく覆った便利なテスト機能です。duskはブラウザ操作とテストケースの抽象化のために幾重ものコードになっていますが、個々のソースはわかりやすく結局はPHPUnitでSeleniumの操作に対してassertするという言葉でまとめられる機能です。以前紹介した個々のテストケース実行コマンドもduskの説明書にないがPHPUnitの説明書にはある機能です。ヘルプには大して記述はありませんがPHPUnitの動作のかなりの部分が簡単にduskで使えます。
追記:
テストケースを記述するクラスが継承するべきTestCaseクラス自身がPHPUnit\Framework\Assertを継承していました。useせずとも
$this->assertTrue(is_null($member->contract), "exist expected null contract.");
で十分でした。