php 如何在Codeception FunctionalTest中使用JSON Body进行POST请求

q9yhzks0  于 2023-05-27  发布在  PHP
关注(0)|答案(3)|浏览(295)

我使用Codeception与Yii2。我需要用JSON内容体做一个POST请求。我不想使用REST模块,因为我还没有配置它。(这是一个更长的故事……)
我已经能够写我的GET测试精彩。现在第一次POST测试,我卡住了。

  1. Functional Test中有一个$I->amOnPage([])方法,只能做GET请求。
  2. sendAjaxPost不允许使用POST发送内容正文。
  3. $I->sendPOST('api/xyz',"{\"xyz\":1}")也没有工作,因为Yii没有得到任何路由,所以改为加载主页。路径在调用堆栈中丢失。
    1.有一个InnerBrowser->_loadPage方法,它允许我用所有可配置的方式进行请求,但我找不到访问它的方法。
    有什么方法可以从测试中访问InnerBrowser对象吗?我试过$I->getModule('PhpBrowser')->_loadPage$this->getModule('Yii2')
gwo2fgha

gwo2fgha1#

可以使用I->SendAjaxPostRequest,它有一个数组参数,其中包含要与请求一起发送的POST值。

0lvr5msh

0lvr5msh2#

您可以更新后端代码以接受原始输入和参数,因此您可以在Codeception测试中传递数组并在API中传递原始输入

$data = json_decode(file_get_contents("php://input"));

    if(!$data) {
        $data = (object) Yii::$app->request->post ();
        $detail = (object) $data->detail;
    } else {
        $detail = $data->detail;
    }
vmdwslir

vmdwslir3#

您必须向测试类添加新的StepAction。这并不难:
in_support/FunctionalTester.php add:

public function sendPostRequest($uri, $parameters, $files = [], $server = [], $content = null) {
    return $this->getScenario()->runStep(new \Codeception\Step\Action('sendPostRequest', func_get_args()));
}

in_support/Helper/Functional.php add:

public function sendPostRequest($uri, $parameters, $files = [], $server = [], $content = null)  {
    return $this->getModule('Yii2')->_request('POST', $uri, $parameters, $files, $server, $content);
}

(将Yii 2更改为您的模块)。
然后在你的测试中:

$this->sendPostRequest('/api/v1/users', json_decode($params));

相关问题