我有一个带有_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()
,则错误将在该行上。
答案 0 :(得分:2)
使用前验证响应。
seeResponseJsonMatchesJsonPath检查json响应中是否存在该元素。
$I->seeResponseJsonMatchesJsonPath('$.token');
使用grabDataFromResponseByJsonPath方法而不是自己解析它也很有用。
$this->api_token = $I->grabDataFromResponseByJsonPath('$.token')[0];
[0]
是必要的,因为grabDataFromResponseByJsonPath会返回匹配项的列表。
如果尚未安装JsonPath方法,您可能需要安装flow/jsonpath
库才能正常工作。