LoginSignup
4
2

More than 5 years have passed since last update.

[Laravel] PHPUnitのdataProviderでfactoryやファサードを使う方法

Posted at

問題点

PHPUnitのdataProviderでfactoryを使おうとすると
Unable to locate factory with name [user_1] [App\Models\User].
こんな感じでWarningが出てうまくいきませんでした

解決方法?

調べてみるとこんな記事が出てきました
https://stackoverflow.com/questions/45139843/using-factory-in-phpunit-provider-fails
つまりdataProviderで
$this->createApplication();
もしくは
$this->refreshApplication();
を呼べばいいらしい(refreshApplicationはcreateApplicationを呼んでるだけなのでどちらも同じ)

再度問題点

テストクラスの中に、dataProviderのメソッドがある場合はこの解決方法で問題ないですが
テストクラスが巨大になるのが嫌なので、自分はよくdataProviderだけで別クラスにしたりしてます
その場合、そのまま上記メソッドを呼ぶことはできません

最終解決方法

createApplicationはCreatesApplicationというトレイトになっているのでインポートすれば呼べるようになります

DataProvider.php
namespace Tests\Unit\DataProvider;

use Tests\CreatesApplication;

class DataProvider
{
    use CreatesApplication;

    public function __construct()
    {
        $this->createApplication();
    }
}

こんな感じでdataProviderのベースクラスを作って継承すれば楽だと思います
ファサードについても同様の問題があるのでこれで解決できます

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2