Почему нельзя создать макет для каждого класса? - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь написать тест для этого класса.



class Page
{
    private function getPage(){
        $curl = curl_init();

        curl_setopt_array($curl, array(
            CURLOPT_URL => "http://example.com/",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_POSTFIELDS => "",
            CURLOPT_HTTPHEADER => array(
                "cache-control: no-cache"
            ),
        ));

        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);

        return $response;

    }

    public function getTitle()
    {
        $page = $this->getPage();
        $re = '/(<title>)(.*?)(<\/title>)/m';
        preg_match_all($re, $page, $matches, PREG_SET_ORDER, 0);
        return $matches[0][2];
    }
}

И так как мой метод getPage обращается к внешнему ресурсу, мне нужно создать для него Mock

namespace Tests;
use PHPUnit\Framework\TestCase;
use App\Kernel\Page;

class PageTest extends TestCase
{
    public function testGetTitle()
    {
        $stub = $this->createMock(Page::class);
        $stub->method('getPage')
            ->willReturn('<title>Example Domain</title>');
        $this->assertSame('Example Domain', $stub->getTitle());
    }
}

Когда я вызываю тест, я получаю сообщение об ошибке:

1) Tests \ PageTest :: testGetTitle Попытка настроить метод "getPage", который не может быть настроен, поскольку он не существует, не был указан, final или stati c

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

1 Ответ

0 голосов
/ 12 апреля 2020

Лучший способ протестировать закрытые методы - не издеваться над ними и не изменять их видимость. Вы должны протестировать метод, делегирующий закрытый метод, в этом случае вам следует вызвать getTitle. или как-то вызвать метод, чтобы увидеть побочный эффект этого закрытого метода (вы делаете это очень хорошо). Но метод getTitle, как вы видите, ничего не делает, он только вызывает метод getPage. Я могу предложить вам сделать макет curl_init, который в этом случае невозможен, но вы можете использовать этот пакет для насмешки. https://github.com/php-mock/php-mock-phpunit. или вы можете переместить содержимое getPage в отдельный класс и использовать его как внедрение зависимостей в своем классе страницы, затем вы можете смоделировать класс и ожидать соответствующего ожидания. Вы также можете проверить этот пример того, как выполнить модульное тестирование вызова curl , как выполнить модульное тестирование вызова curl в php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...