Я тестирую свое приложение 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