Пытаюсь начать использовать тестирование. Придумал себе задачу - протестировать контроль доступа. То есть проверить через автоматический тест, имеет ли пользователь с определенной ролью доступ к определенному экшену.
Смотрю на unit-тесты: они все соответствуют моделям, создается впечатление, что они концептуально не подходят для такой задачи и это будет нецелевое использование инструмента.
Смотрю на функциональные тесты: вроде бы как раз то, что нужно, так как есть amOnPage метод, который позволяет получить ответ на запрос по нужному роуту. НО, тут нет функциональности которая есть в unit-тестах (загрузка данных через haveFixtures перед тестом) и без которой данный тест не реализовать, т.к. сначала нужно добавить пользователей в базу, а только потом проинициализировать RBAC и начинать проверки.
1. Не понимаю какой тип теста мне подходит и подходит ли вообще?
2. Не понимаю, как можно вызвать из теста консольный RbacController/actionInit для инициализации RBAC на тестовой БД?
3. Не понимаю, как осуществлять проверку роута от пользователя с определенной ролью. Тут наверно сначала нужно залогиниться пользователем с заранее известной ролью, а затем как-то делать проверку, например Yii::$app->user->can(...) ?
Как протестировать контроль доступа (RBAC)?
-
- Сообщения: 143
- Зарегистрирован: 2014.08.13, 15:08
-
- Сообщения: 977
- Зарегистрирован: 2014.08.27, 21:54
Re: Как протестировать контроль доступа (RBAC)?
Функциональный.Nicolai6120 писал(а): ↑2017.02.06, 14:32 1. Не понимаю какой тип теста мне подходит и подходит ли вообще?
БД везде заполняется фикстурами.Nicolai6120 писал(а): ↑2017.02.06, 14:32 2. Не понимаю, как можно вызвать из теста консольный RbacController/actionInit для инициализации RBAC на тестовой БД?
Есть такая же:Nicolai6120 писал(а): ↑2017.02.06, 14:32 НО, тут нет функциональности которая есть в unit-тестах (загрузка данных через haveFixtures перед тестом) и без которой данный тест не реализовать.
Код: Выделить всё
class MyCest
{
public function _before(FunctionalTester $I)
{
$I->haveFixtures([
'user' => [
'class' => UserFixture::className(),
]
]);
}
}
Код: Выделить всё
class MyCest
{
public function _fixtures()
{
return ['posts' => PostsFixture::className()]
}
}
Да, логинимся и проверяем:Nicolai6120 писал(а): ↑2017.02.06, 14:32 3. Не понимаю, как осуществлять проверку роута от пользователя с определенной ролью. Тут наверно сначала нужно залогиниться пользователем с заранее известной ролью, а затем как-то делать проверку, например Yii::$app->user->can(...) ?
Код: Выделить всё
class AdminHomeCest
{
...
public function testAccessForbidden(FunctionalTester $I)
{
$I->amLoggedInAs($I->grabRecord(User::className(), ['username' => 'user']));
$I->amOnRoute('admin/default/index');
$I->seeResponseCodeIs(403);
$I->see('Forbidden', 'h1');
}
public function testAccessSuccess(FunctionalTester $I)
{
$I->amLoggedInAs($I->grabRecord(User::className(), ['username' => 'admin']));
$I->amOnRoute('admin/default/index');
$I->see('Control panel', 'h1');
}
}
Последний раз редактировалось ElisDN 2017.02.06, 16:22, всего редактировалось 2 раза.
-
- Сообщения: 143
- Зарегистрирован: 2014.08.13, 15:08
Re: Как протестировать контроль доступа (RBAC)?
Дмитрий, большое спасибо! Не знал что также можно и в функциональном тесте. Наверно нужно больше смотреть в исходный код чтобы видеть такие вещи.
Re: Как протестировать контроль доступа (RBAC)?
Да, в готовые тесты в app-basic/advanced и в список методов модуля.Nicolai6120 писал(а): ↑2017.02.06, 16:16 Наверно нужно больше смотреть в исходный код чтобы видеть такие вещи.