はじめに
LaravelではトレイトIlluminate\Support\Traits\Macroable
を使用しているクラスはマクロによるメソッドの追加が可能な設計となっている。
Laravel\Dusk\Browser
はそれを継承しているため、独自メソッドの登録が可能。
拡張クラスを作る必要が無いので継承関係がややこしいことにならない。
今回はDuskのブラウザテストでウインドウ(タブ)切り替えをするメソッドを追加してみた。
マクロを定義したファイルを作成
クロージャ―で定義するが、コール時にインスタンスがバインドされるようになっているので $this
が使用可能。
tests/Browser/Macros/Macros.php
Browser::macro('switchToLastTab', function() {
// ウインドウがロードされるまで待つ
$this->pause(1000);
$handles = $this
->driver
->getWindowHandles();
$this
->driver
->switchTo()
->window(end($handles));
return $this;
});
AppServicePrpvider
でマクロを登録
app\Providers\AppServiceProvider.php
内のregister
メソッド内で先ほど作成したファイルをロードする。
require_onceなどでファイルをロードするだけ。
参考
https://laracasts.com/discuss/channels/tips/50-loading-form-macros
public function register()
{
if ($this->app->environment('local', 'testing')) {
// duskの登録
$this->app->register(DuskServiceProvider::class);
// ブラウザテスト用マクロを登録
require_once(base_path('tests/Browser/Macros/Macros.php'));
}
}
呼び出す
public function testHoge()
{
$this->browse(function ($browser) {
$browser
->visit('/')
->clickLink('open window')
->switchToLastTab()
->assertTitleContains('Hoge');
});
}