SilverStripe 功能测试在发出 post 请求后数据是否保存在会话中

SilverStripe functional testing if the data is saved in the session after making post request

我正在从事 SilverStripe 项目。我正在为我的单元测试编写功能测试。以下是我要测试的场景。当发出 POST 请求时,我将请求正文中的数据保存到 SilverStripe 会话中。我想断言/测试数据是否存储在会话中。

这是我的控制器class

    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

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

我该如何解决?如何测试数据是否存储在会话中?

I tried this too and it always returns NULL

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

当您在 Injector 创建当前请求之前向 Injector 询问当前请求时,就会出现此错误。这是因为 FunctionalTest 嵌套了它执行测试的 Injector 状态。

如您所述,您仍然可以使用 $this->session() 访问 FunctionalTest 会话。

您的测试失败的主要原因是您的固定页面未发布,并且 FunctionalTest 默认在实时阶段运行(我假设是这样,因为您没有 post 您的固定装置) .您可以在测试 class 中使用 protected static $use_draft_site = true; 使用草稿阶段,或者您可以在 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);