Codeception,无法模拟ajax行为

use*_*178 5 acceptance-testing laravel laravel-4 codeception

我无法通过代码复制来复制ajax调用.

例如:

$I->sendAjaxPostRequest('login/verify', array('name' => 'name', 'password' => 'password'));
$I->seeResponseIsJson();
Run Code Online (Sandbox Code Playgroud)

不会引起任何错误.但另一方面,如果我做以下事情:

$I->sendAjaxPostRequest('login/verify', array('name' => 'name', 'password' => 'password'));
$I->seeResponseIsJson();
$I->seeResponseContainsJson(['login_failed' => 1]);
//or
$I->grabDataFromJsonResponse('data.login_failed');
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误:

ErrorException:传递给Codeception的参数2\Module\REST :: arrayHasArray()必须是数组类型,给定null,在C:\ xampp\htdocs\blog\laravel\vendor\codeception\codeception\src\Codeception\Module中调用\ REST.php在485行并定义

我从上面的错误中理解的是,seeResponseContainsJson或grabDataFromJsonResponse在内部会将响应作为第二个参数传递给arrayHasArray.但看起来无论响应总是空的.

另外,如果我执行以下操作:

$I->sendAjaxPostRequest('login/verify', array('name' => 'name', 'password' => 'password'));
var_dump($I->grabResponse());
Run Code Online (Sandbox Code Playgroud)

我收到这个var_dump():

object(Codeception\Maybe)#753 (3) {
  ["position":protected]=>
  int(0)
  ["val":protected]=>
  NULL
  ["assocArray":protected]=>
  NULL
}
Run Code Online (Sandbox Code Playgroud)

使用Codeception,其他所有工作都按预期工作,我正在使用PhpBrowser.

ebo*_*and 1

我不确定这个答案对其他人有多大用处,但我在谷歌搜索类似的错误消息时到达这里:

ErrorException: Argument 2 passed to Codeception\Module\REST::arrayHasArray() 
must be of the type array, null given
Run Code Online (Sandbox Code Playgroud)

经过一番绞尽脑汁后,我发现控制器(var_dump)的一些调试输出导致返回的文档不是有效的 JSON,因此使用$I->seeResponseContainsJson()会在内部引发错误,因为响应不是有效的 JSON

因此,请确保控制器发送的响应是有效的 JSON,这样错误就会消失