Laravel 5.6:assertSessionHasErrors导致“完整性约束违规:19 NOT NULL约束失败”错误

问题描述 投票:0回答:1

我正在尝试设置一个测试,检查不完整的表单是否无法提交到数据库并且我一直遇到问题,目前每次运行phpunit时这都是我得到的:

enter image description here

我的测试设置如下:

public function test_incomplete_form_cannot_be_submitted()
{
  $user = factory(User::class)->states('confirmed', 'normaluser')->create([
      'id' => '1',
  ]);
  $form = factory(Form::class)->states('incomplete')->create(['status' => 'submitted', 'user_id' => '1', 'id' => '5',]);

  $this->actingAs($user)->post(route('forms.store'), $form->toArray());

  $this->assertSessionHasErrors(['company_name', 'form_info', 'uploads', 'state']);
}

设置不完整表格的工厂设置如下:

 $factory->state(App\Form::class, 'incomplete', function (Faker $faker) {
  return [
    'company_name' => null,
    'form_info' => [
      'contact_fname' => null,
      'contact_lname' => null,
      'address1' => null,
      'dist_city' => null,
      'zip_code' => null,
      'multiple_locations' => null,
      'dist_phone' => null,
      'dist_email' => null,
      'company_website' => null,
      'additional_company_info' => null,
      'company_ownership_structure' => null,
      'business_manager' => [
        '0' => [
          'title' => null,
          'name' => null,
          'phone' => null,
          'email' => null,
        ],
      ],
      'business_planner' => [
        '0' => [
          'title' => null,
          'name' => null,
          'phone' => null,
          'email' => null,
        ],
      ],
      'sales_rep_compensation' => null,
      'midlevel_manager_compensation' => null,
      'sales_state' => null,
      'county' => [
        '0' => null,
      ],
      'split_county' => null,
      'split_county_details' => null,
      'other_brands_represented' => [
        '0' => null,
      ],
      'other_brands_in_territory' => null,
      'company_sales_approach' => null,
      'vision_for_us' => null,
      'who_purchases_the_beer' => null,
      'anticipated_spending_details' => null,
      'what_other_products' => null,
      'chain_retail_coverage' => null,
      'total_size' => null,
      'last_full_year_sales_for_craft' => null,
      'other_breweries_pursue' => null,
      'describe_packaged_beer_space' => null,
      'describe_cooler_space' => null,
      'firkin_handling_procedures' => null,
      'secure_storage' => null,
      'describe_recoup_area' => null,
      'describe_trucks' => null,
      'pos_storage_areas' => null,
      'quality_policies' => null,
      'product_rotation_systems' => null,
      'draft_department_capabilities' => null,
      'channel_focus' => null,
      'channel_focus_details' => null,
      'in_house_signs' => null,
      'sign_printers' => null,
      'sign_shop_employees' => null,
      'other_ownership' => null,
      'other_ownership_details' => null,
    ],
    'state' => 'Alabama',
    'uploads' => [
      'top_25_accounts' => null,
      'first_year_sales_estimate' => null,
      'packaging_space_images' => [
        '0' => null,
      ],
      'storage_images' => [
        '0' => null,
      ],
      'marketing_signage' => [
        '0' => null,
      ],
    ],
  ];
});

我已经尝试从工厂改变测试...->创建工厂...-> make,修改assertSessionHasErrors只检查['uploads.top_25_accounts']并使$ form只是一个空数组,但什么都没有似乎工作。

php laravel testing laravel-5.6 laravel-testing
1个回答
0
投票

问题1:

你的断言永远不会到达,因为你工厂的create()试图在数据库中创建一个新条目,但company_name不能是NULL,它会引发异常。

解:

create()改为make()

$form = factory(Form::class)->states('incomplete')->make([
    'status' => 'submitted', 
    'user_id' => '1', 
    'id' => '5',
]);

问题2:

你必须在响应对象上调用assertSessionHasErrors()$this->assertSessionHasErrors)不存在。

解:

public function test_incomplete_form_cannot_be_submitted()
{
  $user = factory(User::class)->states('confirmed', 'normaluser')->create([
      'id' => '1',
  ]);
  $form = factory(Form::class)->states('incomplete')->make([
      'status' => 'submitted', 
      'user_id' => '1', 
      'id' => '5',
  ]);

  $response = $this->actingAs($user)->post(route('forms.store'), $form->toArray());

  $response->assertSessionHasErrors(['company_name', 'form_info', 'uploads', 'state']);
}
© www.soinside.com 2019 - 2024. All rights reserved.