Laravel,phpunit 由于外键为空而失败
Laravel, phpunit fails due to empty foreign key
我在 运行 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 发送了一个空 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,问题是我不确定如何检索我创建的配置文件的 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'
];});
我已经测试了每种类型的对象的构造并且它正在工作,我失败的是创建评论因为我需要先创建一个配置文件并检索 id 并且出于某种原因使用 $profile ->id 正在拉 null
问题是在使用 make()
时,您的配置文件没有保存到数据库中。
为了能够 use/assign 来自 $profile
的外键 profile_id
,您需要 create()
工厂模型,而不仅仅是 make()
它。
$profile = factory(\App\Profile::class)->create([
'name' => 'John',
'last_name' => 'Snow',
'skills' => 'php'
]);
这应该可以解决问题。
我在 运行 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 发送了一个空 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,问题是我不确定如何检索我创建的配置文件的 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'
];});
我已经测试了每种类型的对象的构造并且它正在工作,我失败的是创建评论因为我需要先创建一个配置文件并检索 id 并且出于某种原因使用 $profile ->id 正在拉 null
问题是在使用 make()
时,您的配置文件没有保存到数据库中。
为了能够 use/assign 来自 $profile
的外键 profile_id
,您需要 create()
工厂模型,而不仅仅是 make()
它。
$profile = factory(\App\Profile::class)->create([
'name' => 'John',
'last_name' => 'Snow',
'skills' => 'php'
]);
这应该可以解决问题。