运行Codeception测试时“尝试获取非对象的属性”错误

时间:2017-05-17 22:51:38

标签: php phpunit codeception

我有一个带有_before()的Cest,其中包含以下代码进行身份验证(API测试):

// Log a user in
$I->haveHttpHeader('Accept', 'application/json');
$I->sendPOST('/authentication/login', ['username' => $this->username, 'password' => $this->password]);

$this->api_token = json_decode($I->grabResponse())->token;

当我运行测试时,我收到以下错误:

[PHPUnit_Framework_Exception] Trying to get property of non-object  


Scenario Steps:

 3. $I->grabResponse() at tests/api/ApiBase.php:19
 2. $I->sendPOST("/authentication/login",{"username":"user@examplecom","password":"abc123"}) at tests/api/ApiBase.php:17
 1. $I->haveHttpHeader("Accept","application/json") at tests/api/ApiBase.php:16

tests/api/ApiBase.php:19$this->api_token = json_decode($I->grabResponse())->token;

似乎$I不再是对象,但我确认它仍然是ApiTester的实例。所以我唯一能想到的是对非对象的属性的调用是在更深层次的地方。

我怎么知道在哪里?我在启用--debug开关的情况下运行它。

[编辑] 这不是json_decode的问题。如果我向上移动$I->grabResponse(),则错误将在该行上。

1 个答案:

答案 0 :(得分:2)

使用前验证响应。
seeResponseJsonMatchesJsonPath检查json响应中是否存在该元素。

$I->seeResponseJsonMatchesJsonPath('$.token');

使用grabDataFromResponseByJsonPath方法而不是自己解析它也很有用。

$this->api_token = $I->grabDataFromResponseByJsonPath('$.token')[0];

[0]是必要的,因为grabDataFromResponseByJsonPath会返回匹配项的列表。

如果尚未安装JsonPath方法,您可能需要安装flow/jsonpath库才能正常工作。