Во-первых, мы должны понять, как работает тестовый бегун.
Даже если каждый тест выполняется в случайном порядке, это не совсем так. Кроме того, вы должны понимать, что setUp
и tearDown
всегда запускаются до и после каждого теста.
В методе setUp
в Laravel оно обновит приложение, если оно не запущено:
if (! $this->app) {
$this->refreshApplication();
}
Так что мы можем подумать, эй, у нас запущен один экземпляр приложения, поэтому нам больше не нужно ModelFactory
, верно?
НЕВЕРНО .
В методе tearDown
, который вызывается после каждого теста, он фактически уничтожает приложение непосредственно перед окончанием метода:
if ($this->app) {
foreach ($this->beforeApplicationDestroyedCallbacks as $callback) {
call_user_func($callback);
}
$this->app->flush();
$this->app = null;
}
Это означает, что ваш файл ModelFactory
включается при каждом запуске теста. Но это происходит в том же процессе PHP. Вот почему вы получаете ошибку уже определенной функции.
Чтобы доказать это легко, просто напишите это в своем файле ModelFactory
:
global $a;
if (is_null($a)) {
$a = 0;
}
else {
$a++;
}
var_dump($a);
Вы увидите, что $a
будет увеличиваться при каждом запуске теста.
Чтобы решить вашу проблему, вы должны просто использовать анонимные функции примерно так:
$factory->define(App\Bien::class, function (Faker $faker) {
return [
// some key-value pairs, don't focus on that
'id_ubicacion' => 1,
'nombre' => $faker->name,
'clase' => 'CONTROL ADMINISTRATIVO',
'codigo' => $faker->ean13,
// some other key-value pairs
];
});