2017-07-17 3 views
1

Ich versuche, eine Modellfabrik zu verwenden, um Modelle in einem Datenanbieter zu erstellen. Es funktioniert, wenn ich die Fabrik im Setup-Verfahren oder im Test direkt verwenden, aber wenn ich versuche, es in einem Datenprovider zu verwenden, erhalte ich eine Fehlermeldung:Verwendung von Factory in PHPUnit-Provider schlägt fehl

1) Warning

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

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

Die Fabrik Definition:

/** @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, 
    ]; 
}); 

Mein Aufruf an die Fabrik:

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

ist es ein Fehler von Laravel oder bin ich etwas fehlt hier?

Edit:

Nach einigen Debuggen ich das Werk gefunden Definitionen sind nicht vor dem Datenanbieter Aufruf geladen, sie genannt, wo (dh definiert), wenn die setUp() -Methode aufgerufen wurde - die nach Daten geschieht Provider Call -, so kann es die Fabrik im Datenprovider nicht finden.

So scheint es mir, dass es unmöglich ist, Fabriken in Datenprovider (oder jede statische Methode in der Testklasse) zu verwenden. Oder ich würde etwas tun, um die Fabriken in meiner Datenanbietermethode zu definieren!

+0

BTW, Es gibt eine unbeantwortete Fragen wie dies in Laracasts [https://laracasts.com/discuss/channels/testing/using-factory-in-phupunit-provider-fails) und [dies] (https://laracasts.com/discuss/channels/testing/unable-to-locate-factory-namedafault-in-laravel-dataprovider) – Aite

Antwort

0

fand ich eine Antwort auf eine andere Frage (durch das gleiche Problem verursacht)

Also, das Problem durch den Aufruf $this->createApplication(); oder $this->refreshApplication(); im Datenprovider Verfahren nach this answer, oder telefonisch es gelöst werden könnte in der Konstruktor nach this answer

wird der Code so aussehen

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

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

    return $someFakeData; 
} 

ich versucht, und arbeitete, obwohl ich das Gefühl, Wie es ein Workaround ist und nicht wie die Dinge funktionieren sollten, würden alle "saubereren" Vorschläge geschätzt werden.

0

Do

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

Um zu sehen, ob es richtig voll qualifizierten Klassennamen zurückgibt, wenn es dann nicht tut, das ist wahrscheinlich das Problem.

+0

es gedruckt "App \ Model \ User" – Aite

+0

Haben Sie dieses Modell? Befindet es sich im App \ Model-Namespace? – verax

+0

Vielen Dank für Ihre schnelle Antwort, Ja, sicher, ich habe dieses Modell (im App \ Model Namespace), und es funktionierte, wenn die Methode factory() von der Methode setup() oder testSomeMethod() in derselben Klasse aufgerufen wurde Datenprovider-Methode – Aite

Verwandte Themen