PHPUnit-Guzzle:API调用未返回所需的响应
我正在使用PHPUnit和Guzzle测试REST api,如果数据库中没有可用的PHPUnit-Guzzle:API调用未返回所需的响应,php,phpunit,guzzle,guzzle6,Php,Phpunit,Guzzle,Guzzle6,我正在使用PHPUnit和Guzzle测试REST api,如果数据库中没有可用的用户名(传入请求参数),它会在数据库中创建一个新记录,并以JSON发送响应,如下所示: { "success": true, "id": "<unique_ID>" } { "success": false, "error": "username is already available" } 这是我的PHPUnit测试用例,用于测试上述API和Guzzle: 这是一
用户名(传入请求
参数),它会在数据库中创建一个新记录,并以JSON发送响应,如下所示:
{
"success": true,
"id": "<unique_ID>"
}
{
"success": false,
"error": "username is already available"
}
这是我的PHPUnit测试用例,用于测试上述API和Guzzle:
这是一个设置
功能,用于设置Guzzle客户端
public function setUp()
{
$this->client = new GuzzleHttp\Client([
'base_uri' => 'http://localhost/test/'
]);
}
这是实际的测试功能:
public function testActualResult()
{
$response = $this->client->post('service.php', [
'json' => [
'operation' => 'create_user',
'user_name' => 'testUser1'
]
]);
var_dump($response);
}
每当我测试它时,我都会得到如下响应:
class GuzzleHttp\Psr7\Response#99 (6) {
private $reasonPhrase =>
string(2) "OK"
private $statusCode =>
int(200)
private $headers =>
array(5) {
'Date' =>
array(1) {
[0] =>
string(29) "Tue, 21 Nov 2017 10:27:22 GMT"
}
'Server' =>
array(1) {
[0] =>
string(47) "Apache/2.4.26 (Win32) OpenSSL/1.0.2l PHP/5.6.31"
}
'X-Powered-By' =>
array(1) {
[0] =>
string(10) "PHP/5.6.31"
}
'Content-Length' =>
array(1) {
[0] =>
string(4) "1357"
}
'Content-Type' =>
array(1) {
[0] =>
string(16) "application/json"
}
}
private $headerNames =>
array(5) {
'date' =>
string(4) "Date"
'server' =>
string(6) "Server"
'x-powered-by' =>
string(12) "X-Powered-By"
'content-length' =>
string(14) "Content-Length"
'content-type' =>
string(12) "Content-Type"
}
private $protocol =>
string(3) "1.1"
private $stream =>
class GuzzleHttp\Psr7\Stream#86 (7) {
private $stream =>
resource(408) of type (stream)
private $size =>
NULL
private $seekable =>
bool(true)
private $readable =>
bool(true)
private $writable =>
bool(true)
private $uri =>
string(10) "php://temp"
private $customMetadata =>
array(0) {
}
}
}
但是我没有收到API调用本身发送回的期望响应
如果我用POSTMAN测试我上面提到的API,它工作得很好,并返回所需的响应。您阅读了吗?在“快速启动”->“使用响应”下,描述了当您想要获取响应正文时,需要使用$response
上的getBody()
函数
您所做的只是转储整个请求变量,其中包含的信息比您想要做的要多得多
有关示例,请参见:
$response = $client->post('your parameters here');
$body = $response->getBody();
echo $body;
你看过报纸了吗?在“快速启动”->“使用响应”下,描述了当您想要获取响应正文时,需要使用$response
上的getBody()
函数
您所做的只是转储整个请求变量,其中包含的信息比您想要做的要多得多
有关示例,请参见:
$response = $client->post('your parameters here');
$body = $response->getBody();
echo $body;
这并不是对您问题的实际回答,但是:单元测试API被认为是不好的做法。单元测试应该测试类和代码,而不是它们的集成。如果API下降,单元测试应该仍然是绿色的。你应该考虑使用集成测试工具来测试这个。感谢@OptimusCrime,但是我看到很多例子/帖子,他们使用PHPUnit和Guzzle来测试api。没有人提到像你这样的人。例如,这并不是对您的问题的实际答案,但是:单元测试API被认为是不好的做法。单元测试应该测试类和代码,而不是它们的集成。如果API下降,单元测试应该仍然是绿色的。你应该考虑使用集成测试工具来测试这个。感谢@OptimusCrime,但是我看到很多例子/帖子,他们使用PHPUnit和Guzzle来测试api。没有人提到像你这样的人。例如,谢谢你的回复。但它仍然没有返回所需的响应。这就是它返回的class-GuzzleHttp\Psr7\Stream#86(7){private$Stream=>resource(408)类型(Stream)private$size=>NULL private$seekable=>bool(true)private$readable=>bool(true)private$writable=>bool(true)private$uri=>string(10)”php://temp“私有$customMetadata=>array(0){}”
@TonyMontana您确定不var\u转储变量而不是对其进行eching吗?我可以验证getBody()
是否以文本形式返回响应。好的,如果我使用json\u decode($response->getBody())
,我将得到预期的响应。但是如果不使用json\u decode
我会得到上面提到的响应。感谢@OptimusCrime的建议,也感谢这篇博文,很抱歉这是json\u解码($response->getBody(),true)
感谢回复。但它仍然没有返回所需的响应。这就是它返回的class-GuzzleHttp\Psr7\Stream#86(7){private$Stream=>resource(408)类型(Stream)private$size=>NULL private$seekable=>bool(true)private$readable=>bool(true)private$writable=>bool(true)private$uri=>string(10)”php://temp“私有$customMetadata=>array(0){}”
@TonyMontana您确定不var\u转储变量而不是对其进行eching吗?我可以验证getBody()
是否以文本形式返回响应。好的,如果我使用json\u decode($response->getBody())
,我将得到预期的响应。但是如果不使用json\u decode
我会得到上面提到的响应。感谢@OptimusCrime的建议,也感谢这篇博文,很抱歉这是json\u解码($response->getBody(),true)