実行前にdusk用の設定ファイルを読み込んだりしているだけで、php artisan dusk
で最終的に実行されるのはphpunit
です。
なので、以下のコマンドどちらでもテストが実行されてしまいます。
ただ設定ファイルを読み込んでくれないので、テスト用DBを向いてくれなかったりと挙動がおかしくなってしまいます。
# 正しいコマンド
$ php artisan dusk tests/Browser/Hoge/HogeTest.php
# 間違ったコマンド、でもExceptionなどは発生しない
$ ./vendor/bin/phpunit tests/Browser/Hoge/HogeTest.php
この打ち間違いに気が付かないで、しばらくハマってしまうことが何度かありました。。。
もう同じことを繰り返したくないのでチェック処理を組み込みます。
php artisan dusk
の実体はDuskCommand.phpです。
DuskCommand.phpからphpunit
を実行する直前に既存.env
を.env.backup
に退避するという処理が動くのでこのファイルの存在有無を判定します。
LaravelDusk用のTestCaseクラスを作成していると思うので、そちらのsetUpに以下を組み込みます。
namespace Tests\Browser;
use Laravel\Dusk\TestCase as BaseTestCase;
class DuskTestCase extends BaseTestCase
public function setUp()
{
parent::setUp();
// artisan dusk ではなく phpunit コマンドで実行してしまうことを防止。少々乱暴だが.env.backupが作成されているかどうかで判定する
// 現在の.envと.env.dusk.XXXが完全一致する場合は.env.backupが作成されないがそのような状況はまず起こらない
if (!file_exists(base_path('.env.backup'))) {
$this->fail('phpunitコマンドではなくartisan duskコマンドで実行してください。');
}
}
注意点
ソースコード中のコメントにも書いてありますが、LaravelDusk実行時に使用するenvファイル.env.dusk.xxx
と.env
の内容が一致する場合は.env.backup
は作成されませんので、この判定はうまく動かなくなります。
ただし、テスト用DBを使用したり、各種ドライバをテスト用のものに変更するなどしてテストを書くことがほとんどなのでこの一致するという状況はまず起こらないと考えます。