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);
我正在从事 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);