Laravel, тестирование промежуточного программного обеспечения маршрута, возвращающего true

#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. Да, это известное ограничение