Как правильно отключить функциональность для тестирования PHPUnit? - PullRequest
4 голосов
/ 26 октября 2010

Я пытаюсь написать несколько модульных тестов для класса, который подключается к API.

Что я хочу сделать, так это изменить класс, чтобы вместо фактического подключения к API он загружал предварительно извлеченный константный фиксатор. Метод внутри класса, который фактически выполняет запрос cURL и возвращает данные, защищен, и я хочу изменить его, чтобы вместо него возвращать содержимое файла фикстуры.

Мой вопрос: как лучше всего это сделать?

Я читал о фиктивных объектах в PHPUnit, но поскольку метод, который я хочу изменить, является внутренним и защищенным, я не думаю, что смогу использовать их правильно?

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

Спасибо.

1 Ответ

1 голос
/ 26 октября 2010

Целью Mocks and Stubs является замена зависимости от функциональности зависимостей, например, когда у вас есть что-то вроде

class Foo
{
    public function __construct($apiConnector) {
        $this->apiConnector = $apiConnector
    }
}

, где $apiConnector - это зависимость, используемая для вызова API, тогда вы заглушаете или смоделируете эту зависимость в своей собственной реализации. Так как эта зависимость вызывается через его общедоступный интерфейс Foo, вы заглушаете метод, который запускает защищенный метод в зависимости.

Если, однако, нет зависимости, но вызов API сделан из testclass, то вам нужно написать собственный класс, который расширяет ваш testclass и реализует свою собственную функцию вызова API, например,

class FooMock extends Foo
{
    protected function queryAPI()
    {
        return $fixture;
    }
}

Затем вы протестируете этот класс вместо фактического.

Если ваш класс действительно подключается к веб-сервису, см. Главу Создание заглушек и насмешка над веб-сервисами

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