php - Laravel test fails with factory create method while passes with make method of factory?

Here is my test:

public function test_only_admin_can_create_series()
{

    $this->withoutExceptionHandling();

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

}

It fails when I use create method of factory, while passes when when I use make method of factory:

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

I am wondering why this happens ??�� First I am creating user through factory and acting as that user, after that going to restricted route. That route is only for admins. But this test fails when I use create methjod of factory but passes when I use make method of factory.

Error on failure is:

  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

Answer

Solution:

I modified default user model in laravel/ui package and added username, but user factory was not modified accordingly. Therefore I was facing error.

In make method of factory, the user was not being saved in the database therefore test was passing. But in create method of factory, user was being saved to database therefore due to null username field in factory I was facing error.

Source