Как выполнить юнит-тест? - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь на 100% охватить код моего сервиса.Вот метод:

<?php

 * Search to public accounts.
 *
 * @param string $query
 *
 * @return TwitterResponse
 */
public function search(string $query): TwitterResponse
{
    try {
        $response = $this->client->getClient()->get(UserEnum::URI_SEARCH, [
            'query' => ['q' => $query,]
        ]);
    } catch (ClientException $e) {
        $response = $e->getResponse();
    }

    return new TwitterResponse($response);
}

Это просто ПОЛУЧИТЕ пользователя с Twitter API.

По моему мнению, я должен разработать два теста: один для попытки, а другой для улова.Ниже приведен мой тест для попытки.

<?php

/**
 * @return void
 */
public function setUp(): void
{
    $this->prophet = new Prophet();

    $this->client = $this->prophet->prophesize(Client::class);
    $this->client->get(Argument::any(), Argument::any())->willReturn(new TwitterResponse(new Response()));
    $this->client->post(Argument::any(), Argument::any())->willReturn(new TwitterResponse(new Response()));

    $this->twitterClient = $this->prophet->prophesize(TwitterClient::class);
    $this->twitterClient->getClient()->willReturn($this->client);

    $this->userService = new UserService($this->twitterClient->reveal());
}

/**
 * Tests if a TwitterResponse is returned with status HTTP_OK.
 *
 * @return void
 */
public function testGetOk(): void
{
    $actual = $this->userService->get('');

    $this->assertEquals(get_class($actual), TwitterResponse::class);
    $this->assertEquals(HttpResponse::HTTP_OK, $actual->getStatusCode());
}

Ниже приведено покрытие кода get ().

Code coverage

Как видите, я не проверял случай улова.Как мне это сделать ?Я уже пытался подделать HTTP-ответ 404 поймать что-то, но это не сработало.У вас есть представление о том, как я могу это сделать?

Спасибо.

РЕДАКТИРОВАТЬ: я пытался это для случая ловли ->

public function testGetKo(): void
{
    $response = new TwitterResponse(new Response(HttpResponse::HTTP_NOT_FOUND));
    $response->setStatusCode(HttpResponse::HTTP_NOT_FOUND);
    $this->client = $this->prophet->prophesize(Client::class);
    $this->client->get(Argument::any(), Argument::any())->willReturn($response);
    $this->twitterClient = $this->prophet->prophesize(TwitterClient::class);

    $actual = $this->userService->get('');

    $this->assertEquals(get_class($actual), TwitterResponse::class);
    $this->assertEquals(HttpResponse::HTTP_NOT_FOUND, $actual->getStatusCode());
}

Phpunit возвращает: Не удалось утверждать, что 200 совпадений ожидается 404. Кажется, что мой фиктивный клиент не работает хорошо.

1 Ответ

0 голосов
/ 22 мая 2018

Это не проверено, так как я обычно не использую пророчество, но я делаю схожие с другими насмешливыми фреймворками:

public function testGetKo(): void
{
    // ... other setup

    $exception = new ClientException();
    $this->client = $this->prophet->prophesize(Client::class);
    $this->client->get(Argument::any(), Argument::any())->willThrow($exception);

И вы, скорее всего, добавите $this->expectException(ClientException::class); перед запуском тестируемой функции.

...