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