Php 如何使用mockry模拟嵌套对象(如GuzzleHttp请求)

Php 如何使用mockry模拟嵌套对象(如GuzzleHttp请求),php,unit-testing,guzzle,mockery,psr-7,Php,Unit Testing,Guzzle,Mockery,Psr 7,我有以下PHP代码: $response = $this->client->request('GET', $path, $requestBody, $headers); $isRequestSuccess = $response->getStatusCode() === "200"; if ($isRequestSuccess) { return $response->getBody()->getContents(); } 我似乎成功地为请求创建了一个模

我有以下PHP代码:

$response = $this->client->request('GET', $path, $requestBody, $headers);
$isRequestSuccess = $response->getStatusCode() === "200";

if ($isRequestSuccess) {
    return $response->getBody()->getContents();
}
我似乎成功地为请求创建了一个模拟:

$mockResponse = \Mockery::mock('GuzzleHttp\Psr7\Response');

$clientMock
    ->shouldReceive('request')
    ->once()
    ->withAnyArgs()
    ->andReturn($mockResponse);

$clientMock->shouldReceive('getStatusCode')->andReturn(200);
但是,我应该如何使用mockry来模拟getStatusCode

它应该返回GuzzleHttp的Psr7\响应对象

我知道$clientMock返回值应该分配给一个参数,但是我应该如何模拟

$response->getStatusCode();

如果要模拟getStatusCode并返回200,则会出现以下错误:

Method Mockery_4_GuzzleHttp_Psr7_Response::getStatusCode() does not exist on this mock object
这不是一个$request,而是一个$response,您最好这样命名。$request变量包含一个response对象,这非常令人困惑

反正

Mockery::mock(ResponseInterface::class)->shouldReceive('getStatusCode')->andReturn(200);

更深入地看,您可能不必在意,响应是模拟的,测试没有用,如果您正确设置了模拟,您将进行测试,而不是测试代码。

您的示例仅适用于getStatusCode方法,但不一定适用于$response->getBody->getContents。我不是在嘲笑整个函数的响应。我想模拟它在其中调用的方法,因为它是嵌套验证整个代码的一部分。还添加了错误。我认为这是我的错。我只是在回答中犯了一个错误。我没有添加makePartial调用。啊,sry,您必须模拟StreamInterface并让其getContents方法返回预期的字符串,然后配置响应模拟的getBody方法以返回模拟的流。
Mockery::mock(ResponseInterface::class)->shouldReceive('getStatusCode')->andReturn(200);