PHPUnit в Laravel setUpBeforeClass не может найти заводской класс

#laravel #phpunit

#laravel #phpunit

Вопрос:

Я пытаюсь запустить модульный тест, который вводит данные в базу данных перед тестовым запуском. Я определил метод установки, который выполняется для каждого тестового примера, чего я не хочу. Метод установки выполняется нормально, без проблем. Я хочу, чтобы данные были введены в базу данных один раз, а затем использовались всеми тестовыми примерами. Поэтому я настраиваю статическую функцию setUpBeforeClass.

 public static function setUpBeforeClass() : void {
    parent::setUpBeforeClass();
    static::$journalOption = new JournalOption;
    $this->user = factory(User::class)->create();


}
  

При вызове пользовательского заводского класса я получаю следующую ошибку:

Исключение InvalidArgumentException: не удается найти завод с именем [по умолчанию] [Приложение Пользователь]

The UserFactory.php файл существует в database/factories/UserFactory.php

 <?php

use IlluminateSupportStr;
use FakerGenerator as Faker;


$factory->define(AppUser::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => Str::random(10),
    ];
});
  

Комментарии:

1. Есть ли у вас use AppUser; в вашем тестовом файле выше public static function setUpBeforeClass() ?

2. Да, у меня это указано выше объявления класса Delena

Ответ №1:

factory Функция не работает должным образом в вашей setUpBeforeClass функции, потому что приложение еще не загружено при запуске этой функции. Вы могли бы загрузить приложение и выполнить миграции в вашей setUpBeforeClass функции, но я бы не рекомендовал этого.

Как правило, вы должны создавать необходимые данные для каждого теста отдельно на случай, если другой тест изменяет или удаляет данные или имеет другие неожиданные побочные эффекты. Поэтому было бы лучше, если бы вы сохранили завод в своей setup() функции. Вы могли бы использовать базу данных SQLite в памяти для своих тестов, если вы беспокоитесь о загрязнении вашей базы данных.

Комментарии:

1. Может быть, само собой разумеется, но я часто забываю добавить, parent::setup() если мы переопределяем setup() метод.