2015-06-19 3 views
0

Я пытаюсь создать класс, который запрашивает внешний API. Каждый метод, который соответствует конечной точке, вызывает вызов метода «главного вызова», ответственного за фактическую отправку запроса в API.Тестирование класса в phpspec с использованием Guzzle

Например:

// $this->http is Guzzlehttp\Client 5.3 

public function call($httpMethod, $endpoint, array $parameters = []) 
{ 
    $parameters = array_merge($parameters, [ 
     'headers' => [ 
      'something' => 'something' 
     ] 
    ]); 

    $request = $this->http->createRequest($httpMethod, $this->baseUrl . $endpoint, $parameters); 

    return $this->http->send($request); 
} 

public function getAll() 
{ 
    return $this->call('GET', 'all'); 
} 

Что я я должен издеваться? Должен ли я использовать willBeCalled() и/или willReturn() на http: createRequest() и send() методах?

Когда я издеваться send(), он говорит: Argument 1 passed to Double\GuzzleHttp\Client\P2::send() must implement interface GuzzleHttp\Message\RequestInterface, null given , и я не знаю, как обеспечить подделку для этого, потому что создание манекена для этого интерфейса требует, чтобы я реализовать 30 методы этого класса.

Вот тест прямо сейчас:

function it_lists_all_the_things(HttpClient $http) 
{ 
    $this->call('GET', 'all')->willBeCalled(); 
    $http->createRequest()->willBeCalled(); 
    $http->send()->willReturn(['foo' => 'bar']); 

    $this->getAll()->shouldHaveKeyWithValue('foo', 'bar'); 
} 

ответ

1

Вы должны высмеивать поведение, что-то вроде этого:

public function let(Client $http) 
{ 
    $this->beConstructedWith($http, 'http://someurl.com/'); 
} 

function it_calls_api_correctly(Client $http, Request $request) 
{ 
    $parameters = array_merge([ 
     'headers' => [ 
      'something' => 'something' 
     ] 
    ]); 

    $http->createRequest('GET', 'http://someurl.com/all', $parameters)->shouldBeCalled()->willReturn($request); 

    $http->send($request)->shouldBeCalled(); 

    $this->getAll(); 
} 
+0

Я думаю, что я пытался что-то подобное. Проблема заключается в том, что если я набираю 'GuzzleHttp \ Message \ RequestInterface $ request' и передаю его' send() ', он скажет:« вам нужно реализовать методы bajillion ». Должен ли я создавать фиктивный класс ниже класса spec, который реализует все эти методы? – johnRivs

+0

Я пробовал этот подход, и теперь мне нужно еще одно. В моем коде мне нужно вернуть '$ this-> http-> send ($ request) -> json()', но phpspec говорит мне, что он не может его найти. На данный момент у меня есть '$ http-> send ($ request) -> json() -> shouldBeCalled()'. – johnRivs

+0

Нужно издеваться над тем, что 'send' возвращает:' $ this-> http-> send ($ request) -> shouldBeCalled() -> willReturn ($ whatever) 'и' $ whatever-> json() -> shouldBeCalled() ' – gvf

Смежные вопросы