2017-02-17 3 views
0

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

Через регистрацию я вижу, что независимо от того, что я вызываю выход из системы, поставщик услуг, который я использую для каждого запроса, чтобы получить аутентифицированного пользователя, строится только по первому запросу, а затем, похоже, сохраняется. Поэтому, несмотря на то, что пользователь вышел из системы, и новый пользователь вошел в систему и имеет новый токен, поставщик услуг не повторно создается для каждого запроса, как в производственном приложении.

Есть ли способ, чтобы поставщик услуг не сохранялся или сохранялся между запросами? Я заметил, что через отладку мне даже не нужно было передавать токен после входа на сервер на последующих аутентифицированных маршрутах, поскольку он просто повторно использует сохраненные данные в поставщике услуг.

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

public function applicant_can_prequalify_if_age_of_majority_for_province_or_older() 
{ 
    // Arrange 
    $this->runPrequalifySeeders(); 

    $provinces = Province::select('id', 'name', 'majority_age')->get(); 
    $provinces->each(function ($province) { 

     // Act 
     $provinceName = str_replace(' ', '', strtolower($province->name)); 
     $username = "{$provinceName}@example.com"; 

     $applicant = $this->createApplicant($username); 
     $this->login($applicant->username); 

     Log::info($applicant->username); // correct username: check 
     Log::info($this->token); // different token each time: check 

     // Applicants can only have one application at a time hence the 
     // new user for each iteration per province: fails on second 
     // iteration as service container persisted... I think 
     $application = $this->createNewApplication()->decodeResponseJson(); 

     // Removed for brevity... 

     $this->logout(); 
    }); 
} 

UPDATE

В случае это было связано с использованием each я приклеил ЗАЯВЛЕНИЯ пару раз и сдвинуты провинцию от коллекции, и он все еще думает, что в Act 2 что пользователь Act 1 аутентифицируется.

// Act 1 
$province = $provinces->shift(); 
$provinceName = str_replace(' ', '', strtolower($province->name)); 
$username = "{$provinceName}@example.com"; 

$this->createApplicant($username)->login($username); 
$application = $this->createNewApplication()->decodeJson(); 

// Removed for brevity 

$this->logout(); 

// Act 2 
$province = $provinces->shift(); 
$provinceName = str_replace(' ', '', strtolower($province->name)); 
$username = "{$provinceName}@example.com"; 

$this->createApplicant($username)->login($username); 
$application = $this->createNewApplication()->decodeJson(); 

// Removed for brevity 

$this->logout(); 

UPDATE 2

Даже если я выход из методов на сервере, в настоящее время вызывается в качестве конечных точек поражаются, как вход, выход, и т.д. Я хотел проверить на выходе из системы был на самом деле работающий и занесенный в черный список токен, и он основан на этом тесте, который вызывает ошибку Unauthenticated 401 после того, как будет достигнута вторая цель создания новой конечной точки приложения. Так что действительно кажется, что поставщик услуг не очищается.

// Act 
$province = $provinces->shift(); 
$provinceName = str_replace(' ', '', strtolower($province->name)); 
$username = "{$provinceName}@example.com"; 

$this->createApplicant($username)->login($username); 
$application = $this->createNewApplication()->decodeJson(); 

$this->logout(); 

// 401 server response since token was successfully blacklisted 
$application = $this->createNewApplication()->decodeJson(); 
+0

Хорошо, просто небольшой комментарий, а не ответ, я обычно подозреваю поведение функции 'each()'. –

+0

Я проверил это, отказавшись от использования 'each' и просто вставив внутренние утверждения пару раз, чтобы имитировать цикл, и в каждом пасте установить' $ province = $ provinces-> shift(); 'поэтому ничего не изменилось. Он по-прежнему считает, что первый пользователь вошел в систему, поскольку он проходит через второй вставной набор операторов. – mtpultz

ответ

1

Так что, как представляется, из-за «тонкость рамки», где экземпляр приложения повторно используется для всех запросов в соответствии с этим Github issue.

Очевидно, вы должны убрать IoC, вызывая $this->refreshApplication(), но когда я это делаю, он сбрасывает базу данных, так как я использую базу данных в памяти.

Поэтому я просто удаляю приложение на каждой итерации после того, как были выполнены утверждения, которые решают эту проблему.

Смежные вопросы