2017-07-17 12 views
1

モデルプロバイダを使用してデータプロバイダでモデルを作成しようとしています。私が直接設定方法やテストに工場を使用する場合、それは動作しますが、私は、データプロバイダでそれを使用しようとする場合、私はエラーを取得する:PHPUnitプロバイダでのファクトリの使用に失敗しました

1) Warning

The data provider specified for MyClassTest::testSomeMethod is invalid.

Unable to locate factory with name [default] [App\Model\User].

ファクトリの定義:

/** @var \Illuminate\Database\Eloquent\Factory $factory */ 
$factory->define(\App\Model\User::class, function (Faker\Generator $faker) { 
    static $password; 

    return [ 
     'id' => $faker->unique()->numberBetween(1, 10000), 
     'email_address' => $faker->unique()->safeEmail, 
     'remember_token' => str_random(10), 
     'password' => $password ?: $password = bcrypt('secret'), 
    ]; 
}); 

$factory->state(\App\Model\User::class, 'guest', function ($faker) { 
    return [ 
     'role_id' => 9999, 
    ]; 
}); 

工場への私の呼び出し:

factory(\App\Model\User::class)->states('guest')->make(); 

は、それはLaravelからのバグであるか、私はここで何かが足りないのですか?

編集:

いくつかのデバッグした後、私はそのファクトリの定義は、データプロバイダーの呼び出しの前にロードされていない、彼らはセットアップ()メソッドが呼び出されたとき(つまり、定義された)と呼ばれる場所を見つけ - データの後にたまたまプロバイダ呼び出し - 、データプロバイダでファクトリを見つけることができません。

したがって、データプロバイダ(またはテストクラス内の静的メソッド)でファクトリを使用することは不可能です。 データプロバイダメソッドでファクトリを定義するために何かすべきことがあります。

+0

ところで、このような未解決の質問は、[this](https://laracasts.com/discuss/channels/testing/using-factory-in-phpunit-provider-fails)や[this]( https://laracasts.com/discuss/channels/testing/unable-to-locate-factory-namedafault-in-laravel-dataprovider) – Aite

答えて

0

、この問題は 、this answerに応じて、データプロバイダの方法で$this->createApplication();または$this->refreshApplication();を呼び出すか、それを呼び出すことによって解決できます私は感じるもののthis answer

に応じコンストラクタはコードが、私はそれを試してみましたが、働いていたこの

public function dataProvider() { 
    $this->refreshApplication(); // or $this->createApplication(); 
    $user = factory(\App\Model\User::class)->states('guest')->make(); 

    // ... 
    // another code to generate data .... 
    // ... 

    return $someFakeData; 
} 

のようになります。回避策のように、どのように動作すべきかについては、「よりクリーンな」提案が評価されます。

0

それは右の完全修飾クラス名を返した場合、それはその後、それはおそらくあなたの問題だしない場合は、参照するには

dd(\App\Model\User::class); 

を行います。私は(同じ問題によって引き起こされる)別の質問で答え

を見つけ

+0

それは "App \ Model \ User"を印刷しました – Aite

+0

あなたはそのモデルをお持ちですか? App \ Model名前空間にありますか? – verax

+0

ありがとう、ありがとう、ありがとう、私はそのモデル(App \ Model名前空間)を持っていて、setup()メソッドまたはtestSomeMethod()メソッドからfactory()メソッドが呼び出されたときに機能しました。データプロバイダメソッド – Aite

関連する問題