Написание некоторых модульных тестов, и я хочу создать объект до того, как тесты в классе будут выполнены. Поэтому я настроил 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
метод (увидеть класс):
/**
* 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();
}
Других решений пока нет …