在CakePHP单元测试中模拟 AJAX 请求

ipakzgxi  于 2022-11-11  发布在  PHP
关注(0)|答案(2)|浏览(147)

我尝试过各种方法,包括设置这篇文章所建议的头部Setting headers for CakePHP Controller unit tests,但我似乎不能在我的控制器单元测试中模拟 AJAX 请求。
我有这个病

if ($this->request->is('ajax')) {

且这

if ($this->params['isAjax'] == 1) {

但是条件不满足。,我甚至尝试设置数组值$this->params['isAjax'] = 1;,但是出现错误

Indirect modification of overloaded property RoomController::$params has no effect

我的问题是在cakePHP中对控制器进行单元测试时,如何成功地模拟 AJAX 请求。

b0zn9rqh

b0zn9rqh1#

您需要坚持使用$this-〉request(在您的例子中是$this-〉request-〉params)。因为$this-〉params本身已被弃用,不应再使用。
但是在您的例子中,您需要做的就是在测试用例中设置正确的$_SERVER或$_ENV键:

testSomeAjaxAction() {
    $_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest';
    $url = Router::url(array('controller' => 'posts', 'action' => 'update', 'ext' => 'json', '?' => array('value' => 2)));
    $options = array(
        'return' => 'vars'
    );
    $result = $this->testAction($url, $options);
    // Assert
}

那么代码中的if ($this->request->is('ajax')) {}就可以正常工作。
请访问https://github.com/dereuromark/tools/wiki/Testing#testing-controllers

pbpqsu0x

pbpqsu0x2#

Cake(从v3.x开始)在它的IntegrationTestTrait中有一个名为configRequest()的方法来处理这个问题。

$this->configRequest([
    'headers' => ['X-Requested-With' => 'XMLHttpRequest']
]);

在发送请求之前,它将触发$this->request->is('ajax')条件。
此外,对于上面的响应,您不需要在测试后取消设置,因为它在parent::tearDown()中被重置。
文件

相关问题