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

Posted

技术标签:

【中文标题】SilverStripe 功能测试是不是在发出 post 请求后将数据保存在会话中【英文标题】:SilverStripe functional testing if the data is saved in the session after making post requestSilverStripe 功能测试是否在发出 post 请求后将数据保存在会话中 【发布时间】:2020-07-01 21:38:41 【问题描述】:

我正在从事 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】:

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

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

您的测试失败的主要原因是您的固定页面未发布,而 FunctionalTest 默认在实时阶段运行(我假设这是因为您没有发布固定页面)。您可以在测试类中使用protected static $use_draft_site = true; 使用草稿阶段,也可以在向其发出 POST 请求之前在setUp() 或您的测试中发布页面。

您的下一个问题是 $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);

【讨论】:

嗨,实际上,我发布了这些页面。我刚刚更新了问题。 我也使用 $this->session()。它只是行不通。会话值始终为空。 感谢您指出 $request->getBody() 为空。这就是会话值始终为空的原因。

以上是关于SilverStripe 功能测试是不是在发出 post 请求后将数据保存在会话中的主要内容,如果未能解决你的问题,请参考以下文章

用于 ModelAdmin 管理页面的 silverstripe dopublish 功能

增加 SilverStripe 网站的最大文件上传大小

如何在 SilverStripe 4 CMS 中添加自定义样式

silverstripe 3 addFieldToTab“设置”

Silverstripe - 在模板中循环非关联数组

使用 SilverStripe 的计划任务