Функциональное тестирование SilverStripe, если данные сохраняются в сеансе после отправки запроса - PullRequest
1 голос
/ 20 марта 2020

Я работаю над проектом SilverStripe. Я пишу функциональные тесты для моего модульного теста. Ниже приведен сценарий, который я пытаюсь проверить. Когда выполняется запрос POST, я сохраняю данные из тела запроса в сеанс SilverStripe. Я хочу подтвердить / проверить, что данные хранятся в сеансе.

Это мой класс контроллера

    class CustomFormPageController extends PageController
    {
        private static $allowed_actions = [
            'testPostRequest',
        ];

        private static $url_handlers = [
            'testPostRequest' => 'testPostRequest',
        ];

        public function testPostRequest(HTTPRequest $request)
        {
            if (! $request->isPOST()) {
                return "Bad request";
            }

            //here I am saving the data in the session
            $session = $request->getSession();
            $session->set('my_session_key', $request->getBody());

            return "Request successfully processed";
        }
    }

Ниже приведен мой класс тестирования

class CustomFormPageTest extends FunctionalTest
{
    protected static $fixture_file = 'fixtures.yml';

    public function testTestingPost()
    {
        $formPage = $this->objFromFixture(CustomFormPage::class, 'form_page');
         $formPage->publish("Stage", "Live");
        $response = $this->post($formPage->URLSegment . '/testPostRequest', [
            'name' => 'testing'
        ]);

        $request = Injector::inst()->get(HTTPRequest::class);
        $session = $request->getSession();
        $sessionValue = $session->get('my_session_key');

        var_dump($sessionValue);
    }
}

Когда Я запускаю тест, я получаю следующую ошибку.

ArgumentCountError: Too few arguments to function SilverStripe\Control\HTTPRequest::__construct(), 0 passed and at least 2 expected

Как я могу это исправить? Как я могу проверить, хранятся ли данные в сеансе?

Я тоже пробовал это, и он всегда возвращает NULL

var_dump($this->session()->get('my_session_key');

1 Ответ

2 голосов
/ 26 марта 2020

Ошибка, которую вы получаете, возникает, когда вы запрашиваете у Injector текущий запрос до того, как он его создал. Это связано с тем, что FunctionalTest вкладывает состояние инжектора, в котором он выполняет тесты.

Вы по-прежнему можете получить доступ к сеансу FunctionalTest с помощью $this->session(), как вы заметили.

Основная причина, по которой ваш тест - это ошибка вызвана тем, что ваша фиксированная страница не публикуется, и FunctionalTest по умолчанию работает в режиме реального времени (я предполагаю, что это потому, что вы не опубликовали свой прибор). Вы можете использовать черновой этап, используя protected static $use_draft_site = true; в своем тестовом классе, или вы можете опубликовать sh страницу в setUp() или свой тест, прежде чем сделать запрос POST к нему.

Ваша следующая проблема что $request->getBody() является нулевым в вашем контроллере, поэтому он ничего не устанавливает.

Это работает, например:

//here I am saving the data in the session
$session = $request->getSession();
$session->set('my_session_key', $request->postVar('name'));
$response = $this->post($formPage->URLSegment . '/testPostRequest', [
    'name' => 'testing'
]);

$sessionValue = $this->session()->get('my_session_key');

$this->assertSame('testing', $sessionValue);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...