Тест Laravel проходит промежуточное ПО аутентификации, но не проходит Auth :: user () с поставщиками данных - PullRequest
0 голосов
/ 23 сентября 2019

Я тестирую свое приложение Laravel с интегрированной конфигурацией PHPUnit, и у меня возникают проблемы с аутентификацией пользователя внутри теста.

У меня есть этот тест (сокращенно)

public function testShowEditForm($user, $expectedStatus, $expectedLocation, $expectedSee, $expectedDontSee) {
    if ($user !== null)
        $this->actingAs($user);

    // $this->assertAuthenticatedAs($user); -> This is true!

    $response = $this->get("/objects/edit/");

    $response->assertStatus($expectedStatus);

    // [...]
}

с этим провайдером данных:

public function showEditFormProvider() {
    return [
        'allowedUser' => [
            UserGenerator::getControllingUser(),
            200,
            null,
            ["something"],
            []
        ]
    ];
}

UserGenerator::getControllingUser() просто запускает фабрику пользователей, добавляет некоторые права ивозвращает объект пользователя.

Протестированный метод (также сокращенный):

public function edit($object_id = null) {
    $user = User::find(Auth::user()->id); // Auth::user() returns null
    // [...]
}

Маршрут для этого метода заключен в части "middleware" => "auth" в маршрутах / web.php

Проблема: поставщик данных правильно вызван, он передает промежуточное ПО , но вызов Auth::user() в методе edit() возвращает ноль - поэтому аутентификация, по-видимому, имеетвсе равно не удалось независимо от прохождения через промежуточное ПО?

  • Если я заменил параметр $ user в testShowEditForm напрямую на UserGenerator :: getControllingUser (), он работает (но это не хороший обходной путь, потому что яу меня много тестовых случаев и поэтому мне нужны поставщики данных).
  • Поэтому я обошел стороной, вызывая провайдер данных с помощью $ this-> showEditFormProvider () в первой строке тестового метода testShowEditForm () - но он вызывается дважды (что является правильным поведением в соответствии с этим 1 ).Но это также не идеальный обходной путь, потому что, если я создаю объект в провайдере для тестирования, он также создается дважды, поэтому утверждения не выполняются.

Что-то я делаю не так?Я уже много раз искал эту тему, и методы actingAs() / be() в методе тестирования, похоже, являются лучшей практикой для насмешек вошедшего в систему пользователя.

1"Всепоставщики данных выполняются как до вызова статического метода setUpBeforeClass, так и до первого вызова метода setUp. "https://phpunit.de/manual/3.7/en/writing-tests-for-phpunit.html

...