m33bo
m33bo

Reputation: 1354

factory not being found in PHP Feature Test Laravel-8

Just playing around with laravel-8 unit tests. I extended the basic TestCase and thought laravels factory method would be available. I checked the composer.json and the factories are being loaded.

I am trying to run this particular test but factory is not found any ideas:

<?php

namespace Tests\Feature\Http\Controllers\Auth;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\User;

class LoginControllerTest extends TestCase
{
    use RefreshDatabase;
    /** @test */
    public function login_authenticates_and_redirects_user()
    {
        $user = factory(User::class)->create();

        $response = $this->post(route('login'), [
            'email' => $user->email,
            'password' => 'password'
        ]);

        $response->assertRedirect(route('home'));
        $this->assertAuthenticatedAs($user);
    }
}

The error I am getting is:

1) Tests\Feature\Http\Controllers\Auth\LoginControllerTest::login_authenticates_and_redirects_user
Error: Call to undefined function Tests\Feature\Http\Controllers\Auth\factory()

Upvotes: 3

Views: 2930

Answers (2)

Pedro Santos
Pedro Santos

Reputation: 78

  1. On laravel 8 models are at 'App\Models\'.
  2. It changes how factory works. See at docs.

So, it should be like:

<?php

namespace Tests\Feature\Http\Controllers\Auth;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Models\User;

class LoginControllerTest extends TestCase
{
    use RefreshDatabase;
    /** @test */
    public function login_authenticates_and_redirects_user()
    {
        $user = User::factory->create();

        $response = $this->post(route('login'), [
            'email' => $user->email,
            'password' => 'password'
        ]);

        $response->assertRedirect(route('home'));
        $this->assertAuthenticatedAs($user);
    }
}

Upvotes: 2

m33bo
m33bo

Reputation: 1354

Turns out in upgrading to laravel-8 release notes:

"Laravel's model factories feature has been totally rewritten to support classes and is not compatible with Laravel 7.x style factories."

So in order to make it work I used:

$user = \App\Models\User::factory(User::class)->make();

Upvotes: 1

Related Questions