使用phpspec中另一个模拟返回的模拟

时间:2016-04-04 15:32:57

标签: post mocking httprequest phpspec

我是phpspec的新手(来自phpunit),我在设置另一个模拟返回的模拟行为时遇到问题。

我正在围绕Guzzle客户端创建一个包装器类,我想检查响应的输出。

这是规范:

function it_gets_response_status_code(Client $client, Url $url, Response $response)
{
    $this->beConstructedWith($client);

    $url->__toString()->willReturn('http://example.com');
    $data = ['foo' => 'bar'];

    $response->getStatusCode()->willReturn(200);
    $client->request('POST', $url, ['form_params' => $data])->willReturn($response);

    $this->post($url, $data);
    assert($this->getResponseStatusCode() === 200); // Failing! :(
}

和我班上的相应功能:

public function post(Url $url, array $data)
{
    $this->response = $this->client->request('POST', (string) $url, ['form_params' => $data]);
}

public function getResponseStatusCode()
{
    return $this->response->getStatusCode();
}

断言失败,当我检查这个状态代码是什么时,我看到的是PhpSpec\Wrapper\Subject的实例,而不是整数200。我在这里缺少什么?

我搜索过并搜索过,但无法找到有关使用phpspec中另一个模拟返回的模拟的资源。我想知道它的原因是它是代码味道吗?如果是这样,我会很高兴看到我能以不同的方式做到这一点(目前我无法看到如何保持代码简单和不同的做法)。

1 个答案:

答案 0 :(得分:0)

尝试:

assert($this->getResponseStatusCode()->getWrappedObject() === 200);

这样:

$response->getStatusCode()->willReturn(200)

返回一个包含在Subject对象中的'200'字符串,然后您可以根据需要进行模拟/存根调用。要获得主题的真正价值,您需要致电getWrappedObject