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



我正在进行一个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 SilverStripeControlHTTPRequest::__construct(), 0 passed and at least 2 expected

我该怎么修?如何测试数据是否存储在会话中?

我也尝试过,它总是返回NULL

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

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

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

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

下一个问题是$request->getBody()在控制器中为null,所以它没有设置任何内容。

这是有效的,例如:

//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);

最新更新