2016-01-29 2 views
0

Я получаю эту ошибку во время выполнения теста PHPUnit:Laravel, PHPUnit терпит неудачу из-за пустой внешний ключ

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'profile_id' cannot be null (SQL: insert into `comments` (`description`, `status`, `profile_id`, `project_id`, `updated_at`, `created_at`) values (Awesome Comment, active, , 21, 2016-01-29 00:05:21, 2016-01-29 00:05:21)) 

Как вы можете видеть, что посылает пустой идентификатор для profile_id и Я создаю перед созданием комментария. Вот код моего теста:

public function testProjectCommentCreation() 
{ 
    $category = factory(\App\Category::class)->create(); 
    $category->projects()->save(factory(\App\Project::class)->make()); 


    $profile = factory(\App\Profile::class)->make([ 
     'name' => 'John', 
     'last_name' => 'Snow', 
     'skills' => 'php' 
    ]); 

    $category->projects[0]->comments()->save(factory(\App\Comment::class)->make([ 
     'description'=>'Awesome Comment', 
     'status'=>'active', 
     'profile_id'=>$profile->id 
    ])); 

    $this->post(route('api.projects.comments.store', ["projects" => $category->projects[0]->id]), $category->projects[0]->comments->jsonSerialize(), $this->jsonHeaders) 
     ->seeInDatabase('comments', ['project_id' => $category->projects[0]->id]) 
     ->assertResponseOk(); 
} 

Проект относится к категории и принадлежит комментарий к проекту и профиль, так что мне нужно отправить как внешние ключи ЗНАЧЕНИЯ profile_id и project_id, проблема в том, что я Не знаю, как получить идентификатор созданного мной профиля.

Это заводы, которые я использую:

$factory->define(App\Profile::class, function (Faker\Generator $faker) { 
return [ 
    'name' => $faker->name, 
    'last_name' => $faker->name, 
    'status' => 'active', 
    'avatar' => str_random(10), 
    'skills'=> str_random(10), 
    'notifications'=>'on' 
]; 
}); 

$factory->define(App\Comment::class, function (Faker\Generator $faker) { 
return [ 
    'description' => str_random(10), 
    'status' => 'active', 
    'profile_id' => 1, 
    'project_id' => 1 
];}); 

$factory->define(App\Category::class, function (Faker\Generator $faker) { 
return [ 
    'description' => str_random(10), 
    'status' => 'active' 
];}); 

$factory->define(App\Project::class, function (Faker\Generator $faker) { 
return [ 
    'description' => str_random(10), 
    'status' => 'active', 
    'privacy' => 'false' 
];}); 

Я проверил строительство каждого типа объекта, и она работает, что я не суметь это создать комментарий, так как мне нужно, чтобы создать Сначала профиль и извлечение идентификатора и по какой-либо причине с помощью $ profile-> id тянет нуль.

ответ

2

Проблема заключается в том, что ваш профиль не сохраняется в базе данных при использовании make().

Для вас, чтобы иметь возможности использовать/назначить внешний ключ profile_id из $profile, вам нужно create() модели фабрики, а не только make() его.

$profile = factory(\App\Profile::class)->create([ 
    'name' => 'John', 
    'last_name' => 'Snow', 
    'skills' => 'php' 
]); 

Это должно сделать трюк.

+0

Вы правы, у меня есть еще одна ошибка, но она другая. Огромное спасибо. –

Смежные вопросы