Отношения Factory Muffin являются нулевыми при использовании метода экземпляра

Я работаю над приложением 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
}

person patricksayshi    schedule 12.05.2015    source источник


Ответы (1)


Хорошо, чтобы заставить factory muffin правильно конкретизировать встроенные отношения mongo, вы должны сделать следующее:

// factories/all.php

$embedded_contact = function() {
    $definitions = [
        'first_name' => Faker::firstName(),
        'email' => Faker::email(),
        // ... etc
    ];

    return array_map(
        function($item) { return $item(); },
        $definitions
    );
}

$fm->define('My\Models\Event', [
    'title' => Faker::text(75),
    'contact' => $embedded_contact
]);

Если это кажется обременительным и хакерским... Я согласен! Мне определенно интересно узнать о более простых методах для этого. На данный момент я действую, как указано выше, и он работает как для тестирования, так и для заполнения.

person patricksayshi    schedule 13.05.2015