#laravel #unit-testing #phpunit #laravel-6
#laravel #модульное тестирование #phpunit #laravel-6
Вопрос:
Я написал несколько тестов, чтобы проверить промежуточные программы, которые применяются к определенным маршрутам. У меня определены ворота, чтобы использовать их в качестве проверки ролей.
Мои маршруты определены как таковые:
Route::get('/', 'UserController@index')->middleware(['can:Administrator'])->name('user.index');
В моем поставщике услуг маршрутизации я определил, что этот файл маршрута также использует другое промежуточное программное обеспечение, называемое api
.
В моем модульном тестировании я извлекаю маршрут по имени и сравниваю промежуточные программы, которые он должен применять, как таковой
public function testMiddlewaresAssignedToUserIndex() {
$expectedMiddlewares = ['api', 'can:Administrator'];
$this->assertEquals($expectedMiddlewares, Route::getRoutes()->getByName('user.index')->gatherMiddleware());
}
Это работает так, как задумано. Однако, когда требуется применить более одного условия, такого как «Администратор или супервизор», оно возвращает true . Для проверки любой из этих ролей маршрут записывается как таковой:
Route::get('/', 'UserController@index')->middleware(['can:Administrator' ||'can:Supervisor'])->name('user.index');
Что происходит сейчас, так это то, что в тесте он возвращается ['api', true]
. Это не позволит мне проверить, что эти 2 шлюза применяются как промежуточные программы к маршруту.
Какой другой подход или как я могу протестировать промежуточное программное обеспечение маршрута?
Комментарии:
1.
['can:Administrator' ||'can:Supervisor']
это недопустимый способ сделать это. Я думаю, вам следует определить политику, подобнуюAdministratorOrSupervisor
и используемуюcan:AdministratorOrSupervisor
.['can:Administrator' ||'can:Supervisor']
просто делаетOR
между двумя правдивыми строками, поэтому вернет логическое значение true (которое вы видите в своем тесте)2. но это означало бы, что мне нужно будет создать несколько комбинаций ролей, представьте их масштабирование
3. Да, это известное ограничение