[Laravel 7.x]DuskでBrowserにメソッドを追加したい!

未分類

はじめに

Duskでテストを書いていると、どうしても共通処理とか独自なメソッドを追加したいと思うわけで、ここ(https://readouble.com/laravel/7.x/ja/dusk.html)の「ブラウザマクロ」によると、

さまざまなテストで再利用可能な、カスタムブラウザメソッドを定義したい場合は、Browserクラスのmacroメソッドを使用してください。

https://readouble.com/laravel/7.x/ja/dusk.html

ということなので、早速作っていきましょうかね。

準備

サービスプロバイダの追加

% php artisan make:provider DuskServiceProvider

「app/Providers/DuskServiceProvider.php」が出来上がる。
通常であれば、「config/app.php」に追記するのだが、テスト時だけロードすることを考えると、どこでロードするか…悩んでいたのだけれど、

Laravelに含まれているconfig/app.phpファイルを開けば、providers配列が見つかるでしょう。そこにある全サービスプロバイダクラスが、アプリケーションのためにロードされます。ほとんどのプロバイダは、すべてのリクエストで必ずロードされるとは限らず、そのプロバイダが提供するサービスが、実際に必要なときにのみロードされる「遅延」プロバイダです。

https://readouble.com/laravel/7.x/ja/providers.html

なるほど、本番環境の場合、テストがないので、ロードされないってことか。それならいつもどおりでよいな。

サービスプロバイダの登録

config/app.php を編集

'providers' => [
	App\Providers\DuskServiceProvider::class,	// 追加
],

やってみよう!

先程作った DuskServiceProvider に、マクロを追加してみる。
app/Providers/DuskServiceProvider.php を編集

	/**
	 * Bootstrap services.
	 *
	 * @return void
	 */
	public function boot()
	{
		// このマクロを追加する。
		Browser::macro('debugAlert', function ($text = null) {
			$this->driver->executeScript('alert("' . $text . '");');

			return $this;
		});
	}

ブラウザ内で、アラートを表示させるデバッグ用のマクロ。

$browser->debugAlert('にゃんにゃん');

を実行すると、こんな感じでアラートが表示される。いい感じですね。

まとめ

Duskで最初に作ったテストはもっとダサい作り方をしていたから、これで少しはすっきりする。

コメント

タイトルとURLをコピーしました