Проблема с методом тестирования с actAs - PullRequest
1 голос
/ 23 марта 2020

У меня есть этот код:

/**  @test */
public function testBasicExample()
{
    $user = User::find(1);
    // $user = factory(User::class)->create();
    $response = $this->actingAs(User::find(1))->json('POST', '/store/ad', [
                'title' => 'Hello World',
                'city' => 1,
                'phone' => '666555555',
                'description' => 'fasd asd as d asd as d asd as d asd as d asd as d asd as da sd asd',
                'user_id' => 1
    ]);

    $response
        ->assertStatus(201)
        ->assertJson([
            'created' => true,
        ]);
}

К сожалению, в данный момент у меня возникла первая проблема. Не удалось увидеть таблицу пользователей.

Освещение \ База данных \ QueryException: SQLSTATE [HY000]: Общая ошибка: 1 нет такой таблицы: пользователи (SQL: выберите * из "пользователей", где " users "." id "= 1 limit 1)

Я смотрю, как я могу решить мою проблему, и я обнаружил, что должен использовать DatabaseMigrations . Поэтому я добавляю, что

use Illuminate\Foundation\Testing\DatabaseMigrations;
class ExampleTest extends TestCase
{
    use DatabaseMigrations;
//...
}

Но теперь у меня возникла новая проблема.

TypeError: Аргумент 1, передаваемый в Illuminate \ Foundation \ Testing \ TestCase :: actAs (), должен реализовывать интерфейс Подсветка \ Контракты \ Auth \ Authenticatable, null, заданная

Так что я реализую это

use Illuminate\Contracts\Auth\Authenticatable;
class ExampleTest extends TestCase
{
    use DatabaseMigrations;
    use Authenticatable;
//...
}

Сгенерирована новая ошибка:

Тесты \ Feature \ ExampleTest не может использовать Illuminate \ Contracts \ Auth \ Authenticatable - это не черта

Как я могу решить мою проблему? Как я могу это проверить?

@ Edit

Я обнаружил проблему, но не знаю, почему она не работает. У меня есть это правило для проверки города

'city' => 'required|integer|exists:cities,id'

Проблема является последним правилом: существует: города, id. Я пробовал разные идентификаторы существующих городов и ничего не работает.

1 Ответ

0 голосов
/ 23 марта 2020

Проблема в том, что черта DatabaseMigrations будет сбрасывать базу данных после каждого теста, поэтому в базе данных нет пользователя при запуске теста.

Это означает, что вы в данный момент проходите null в следующей строке:

$this->actingAs(User::find(1))

Сначала вы должны создать пользователя с помощью помощника factory:

$user = factory(User::class)->create();

Следующее должно решить вашу проблему:

1 - Удалите следующее:

use Authenticatable;

Не уверен, почему вы даже добавили это, исключение ясно указывает, что аргумент, передаваемый $this->actingAs(), должен реализовывать интерфейс Authenticatable, а не текущий класс.

2 - измените свой тест на что-то вроде этого:

/**  @test */
public function testBasicExample()
{
    $this->actingAs(factory(User::class)->create())
        ->json('POST', '/store/ad', [
            'title' => 'Hello World',
            'city' => 1,
            'phone' => '666555555',
            'description' => 'fasd asd as d asd as d asd as d asd as d asd as d asd as da sd asd',
            'user_id' => 1
        ])
        ->assertStatus(201)
        ->assertJson(['created' => true]);
}
...