Пишу несколько модульных тестов, и я хочу, чтобы объект был создан до того, как тесты в классе будут выполнены. Итак, я установил метод setUpBeforeClass():
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Location;
class UserTests extends TestCase {
const FAKEID = 9999999;
public static function setUpBeforeClass() : void {
parent::setUpBeforeClass();
factory(Location::class)->make(["id" => self::FAKEID])->save();
}
}
Но когда я пытаюсь запустить это, я получаю такую ошибку:
InvalidArgumentException: Unable to locate factory with name [default] [App\Location].
Но фабричный класс настроен правильно. Фактически, если я перенесу эту же строку в одну из моих тестовых функций, она будет работать отлично.
public function testCreateUser() {
factory(Location::class)->make(["id" => self::FAKEID])->save();
// do other stuff...
}
Единственное, что меня отличает от setUpBeforeClass(), так это то, что это статический метод, но я не знаю, почему это помешает работе фабричного класса.






Laravel выполняет множество настроек в методе setUp() в классе TestCase. Перед этим вызывается метод setUpBeforeClass(), поэтому ваша фабрика еще не загружена.
Метод TestCase класса setup в Laravel (увидеть класс):
/**
* Setup the test environment.
*
* @return void
*/
protected function setUp()
{
if (! $this->app) {
$this->refreshApplication();
}
$this->setUpTraits();
foreach ($this->afterApplicationCreatedCallbacks as $callback) {
call_user_func($callback);
}
Facade::clearResolvedInstances();
Model::setEventDispatcher($this->app['events']);
$this->setUpHasRun = true;
}
Измените свой код, чтобы вместо него использовать setUp:
protected static function setUp() : void
{
parent::setUp();
factory( Location::class )->make( ["id" => self::FAKEID] )->save();
}
Я понимаю, о чем вы говорите, но это то, что вы получаете, когда вступаете в брак с фреймворком ... Laravel уже делает это перед каждым тестом ... Вы хотите использовать фабрики, основанные на Laravel, поэтому вам нужен Laravel, когда он настроен и запущен, и это после вызова прибора TestCase setUp ..
Кстати, вы всегда должны сбрасывать состояние в начале каждого теста. Основание тестов на предыдущих тестовых состояниях - нет в модульном тестировании. Вот почему Laravel также сбрасывает себя при каждом тесте.
Что ж, я просто вставляю некоторые записи, необходимые для внешних ключей, в записи, которые я на самом деле тестирую. Как и в примере, который я использовал, мне нужно указать местоположение, прежде чем я смогу создать пользователя. Я ожидаю, что приду с этим ответом, просто похоже на ненужный доступ к БД, после десятков тестов.
Почему это не работает и в dataProvider? Есть ли способ обойти это?
Но этот метод запускается перед каждым тестом. Кажется пустой тратой создавать и вставлять новые записи перед каждым тестом и удалять их после каждого теста.