【问题标题】:Laravel test fails with factory create method while passes with make method of factory?Laravel 测试通过工厂创建方法失败,而通过工厂的 make 方法通过?
【发布时间】:2021-07-30 05:54:07
【问题描述】:

这是我的测试:

public function test_only_admin_can_create_series()
{

    $this->withoutExceptionHandling();

    $this->actingAs(User::factory()->make());
    
    $this->get('/admin/series/create')
         ->assertRedirect('/');

}

使用工厂的create方法失败,使用工厂的make方法失败:

$this->actingAs(User::factory()->make());   <==== PASSES
$this->actingAs(User::factory()->create()); <==== FAILS

我想知道为什么会这样???? 首先,我通过工厂创建用户并充当该用户,然后进入受限路线。该路线仅供管理员使用。但是当我使用工厂的 create 方法时,这个测试失败了,但当我使用工厂的 make 方法时,这个测试通过了。

失败时的错误是:

  FAIL  Tests\Feature\CreateSeriesTest
  ⨯ only admin can create series

  ---

  • Tests\Feature\CreateSeriesTest > only admin can create series
   Illuminate\Database\QueryException 

  SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: users.username (SQL: insert into "users" ("name", "email", "email_verified_at", "password", "remember_token", "updated_at", "created_at") values (Patsy Hackett, albin.lindgren@example.net, 2021-05-08 00:49:32, $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi, ida9HDyPdX, 2021-05-08 00:49:32, 2021-05-08 00:49:32))

  at C:\xampp\htdocs\sandcasts\vendor\laravel\framework\src\Illuminate\Database\Connection.php:678
    674▕         // If an exception occurs when attempting to run a query, we'll format the error
    675▕         // message to include the bindings with SQL, which will make this exception a
    676▕         // lot more helpful to the developer instead of just the database's errors.
    677▕         catch (Exception $e) {
  ➜ 678▕             throw new QueryException(
    679▕                 $query, $this->prepareBindings($bindings), $e
    680▕             );
    681▕         }
    682▕

  1   C:\xampp\htdocs\sandcasts\vendor\laravel\framework\src\Illuminate\Database\Connection.php:471
      PDOException::("SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: users.username")

  2   C:\xampp\htdocs\sandcasts\vendor\laravel\framework\src\Illuminate\Database\Connection.php:471
      PDOStatement::execute()


  Tests:  1 failed
  Time:   0.49s

【问题讨论】:

  • 失败信息是什么?
  • @IGP 我已经更新了问题,请看看...
  • 检查您的用户工厂中的定义是否包含“用户名”属性。如果没有,那就可以解释为什么它会抛出一个非空约束违规。
  • 同时检查“用户名”是否包含在您的用户模型的 $fillable 属性中
  • 非常感谢,我修改了 laravel/ui 包中的默认用户模型并添加了用户名,但用户工厂没有相应修改。因此我面临错误。非常感谢您再次提供帮助@IGP

标签: php laravel testing


【解决方案1】:

我修改了laravel/ui包中的默认用户模型并添加了用户名,但用户工厂没有相应修改。因此我遇到了错误。

在工厂的make方法中,用户没有被保存在数据库中,因此测试通过了。但是在工厂的创建方法中,用户被保存到数据库中,因此由于工厂中的用户名字段为空,我遇到了错误。

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多