我正在使用jenssegers\laravel-mongodb软件包开发一个Laravel 5应用程序,我正在尝试与工厂Muffin一起运行,以帮助快速测试和播种等等。
我在工厂定义中定义了关系(下面的代码)--当我运行种子在数据库中创建新记录时,它们可以工作。所谓“工作”,是指它们正确地将相关数据附加到父模型,并将所有这些记录持久化到数据库。但是,当我运行$muffin->instance('My\Object')方法时,它们不能工作,该方法创建了一个新实例,而没有持久化它。所有的关系都是无效的。
从某种意义上讲,这是合理的。当模型存储在数据库中时,它们由对象_id键关联。在存储模型之前,该密钥不存在。所以当我调用instance方法时,我实际上可以通过调试看到它确实生成了相关的模型,但是它还没有任何键来建立关系,所以数据就会变得非常重要。
这是一个令人沮丧的原因,因为我希望能够生成一个完全充实的模型及其关系,例如,当我将它的数据提交给我的路线和东西时,看看它是否被保存或通过验证等等。也就是说,现在我无法检查联系人的电子邮件是否有效,等等。
简化的代码示例如下--我是不是完全错误地这样做了?这是我第一次与蒙戈和穆芬工厂合作。这能按我想的方式运作吗?
// 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
}发布于 2015-05-13 17:21:39
好的,为了让工厂的松饼能够很好地充实芒果的嵌入关系,你必须这样做:
// 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
]);如果这听起来又麻烦又烦人..。我同意!我很想知道更简单的方法来解决这个问题。现在,我正在继续上面的工作,它正在进行测试和播种。
https://stackoverflow.com/questions/30202845
复制相似问题