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 4 CMS 中添加自定义样式