Как проверить доступ к / create?

#laravel #laravel-backpack

#laravel #laravel-рюкзак

Вопрос:

Я пытаюсь написать функциональный тест для проверки разрешений на доступ к CRUD для моей модели («company»), но он возвращает ошибку 500 вместо ожидаемых 200.

Мой код выглядит следующим образом:

     public function testCompaniesOfficeAdmin()
    {
        $this->office_admin = User::factory()->create();
        $this->office_admin->assignRole('office administrator');
        Auth::guard(config('backpack.base.guard'))->login($this->office_admin);

        $response = $this->actingAs($this->office_admin, 'web')->get('/company');
        $response->assertStatus(200);

        $response = $this->actingAs($this->office_admin, 'web')->get('/company/create');
        $response->assertStatus(200);
    }

  

Первое утверждение работает, как и ожидалось, но второе не выполняется с ошибкой 500, на которую жалуются

Исключение ErrorException: array_filter() ожидает, что параметр 1 будет массивом, значение null указано в файле /…/vendor/backpack/crud/src/app/Library/CrudPanel/Traits/SaveActions.php в строке 52

Я предполагаю, что он каким-то образом пытается сохранить данные при доступе к /company / create , что я ожидал бы для POST, но не для GET .

Что я делаю не так?

Комментарии:

1. Вы не можете выполнить get, когда пытаетесь протестировать сообщение, вот почему вы получаете ошибку 500 в первую очередь. Для теста create вы должны выполнить post-вызов с некоторыми поддельными данными в формате, ожидаемом post-запросом.

2. @Gi1ber7 op проверяет доступ к странице, которая разрешает действие create. Просмотр страницы на самом деле является запросом GET.

Ответ №1:

Если мы посмотрим vendor/backpack/crud/src/app/Library/CrudPanel/Traits/SaveActions.php на строку, указанную в ошибке, мы увидим эту функцию:

 /**
 * Gets the save action that has the desired order.
 *
 * @param int $order
 * @return array
 */
public function getSaveActionByOrder($order)
{
    return array_filter($this->getOperationSetting('save_actions'), function ($arr) use ($order) {
        return $arr['order'] == $order;
    });
}
  

Что делает эта функция, получая доступные действия сохранения для этой кнопки на странице создания:

введите описание изображения здесь

Тот факт, что вы получаете эту ошибку, говорит нам о том, что $this->getOperationSetting('save_actions') она возвращается null .

Что касается того, почему это возвращает null, я бы проверил, изменяет ли приложение save_actions настройки где-либо, и начал искать там. Возможно, мы сможем дополнительно помочь, если вы опубликуете полный код контроллера CRUD.