Я работаю над приложением Laravel 5, используя пакет jenssegers\laravel-mongodb, и я пытается начать работу с Factory Muffin, чтобы помочь с быстрым тестированием и раздачей и т. д.
Я определил отношения в своих заводских определениях (код ниже) — и они работают, когда я запускаю семена для создания новых записей в базе данных. Под «работой» я имею в виду, что они правильно прикрепляют связанные данные к родительской модели и сохраняют все эти записи в базе данных. Но они не работают, когда я запускаю метод $muffin->instance('My\Object')
, который создает новый экземпляр без его сохранения. Все отношения возвращаются как нулевые.
В некотором смысле это имеет смысл. Когда модели хранятся в базе данных, они связаны ключом объекта _id
. Этот ключ не существует, пока модель не будет сохранена. Поэтому, когда я вызываю метод instance
, я на самом деле вижу с помощью отладки, что он создает модели, которые были бы связаны, но у него еще нет ключа для установления отношения, так что данные просто как бы идет пуф.
Это облом, потому что я хотел бы иметь возможность генерировать полностью конкретизированную модель с ее отношениями и видеть, например, сохраняется ли она или проходит проверку и еще много чего, когда я отправляю ее данные в свои маршруты и прочее. То есть прямо сейчас я бы не смог проверить, действителен ли адрес электронной почты контакта и т. д.
Примеры упрощенного кода приведены ниже. Я делаю это совершенно неправильно? Я впервые работаю с Mongo и Factory Muffin. Должно ли это вообще работать так, как я хочу?
// factories/all.php
$fm->define('My\Models\Event', [
'title' => Faker::text(75),
'contact' => 'factory|My\Models\Contact'
]);
$fm->define('My\Models\Contact', [
'first_name' => Faker::firstName(),
'email' => Faker::email(),
... etc
]);
// EventControllerTest.php
...
/**
* @var League\FactoryMuffin\FactoryMuffin
*/
protected $muffin;
public function setUp()
{
parent::setUp();
$this->muffin = new FactoryMuffin();
$this->muffin->loadFactories(base_path('tests/factories'));
}
...
public function testCanStoreEvent()
{
$event = $this->muffin->instance('Quirks\Models\Event');
echo $event->contact; // returns null
$event_data = $event->toArray();
$this->call('POST', 'events', $event_data);
$retrieved_event = Event::where('title', '=', $event->title)->get()->first();
$this->assertNotNull($retrieved_event); // passes
$this->assertRedirectedToRoute('events.edit', $retrieved_event->id); // passes
// So, the event is persisted and the controller redirects etc
// BUT, related data is not persisted
}