PHPUnit и швы - PullRequest
       14

PHPUnit и швы

1 голос
/ 20 декабря 2011

Итак, я решил исследовать использование швов в PHPUnit, но я столкнулся с проблемой

Я переставил свой класс таким образом, чтобы сломать зависимости для класса базы данных

db_Class::getMyData($vars);

стал

self::getMyData($vars);

и я добавил функции в свой код

protected static function getMyData($vars) {
    return db_Class::getMyData($vars);
}

Это было сделано, чтобы я мог создать класс, который наследует этот класс и перегружает функцию getMyData. Чтобы иметь возможность изменить его, когда я запускаю свои тесты.

Например, в классе шва, который расширяет класс выше и перегружает эту функцию:

protected static function getMyData($vars) {
    return array('id'=>1, 'name'=>"My Name");
}

Это было бы очень полезно, так как я могу изменять данные так, как мне нравится. Однако при использовании PHPUnit у вас есть возможность запускать макеты, используя $ this-> getMock и т.п. Смогу ли я когда-нибудь достичь этого в классе шва.

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

Майкл С. Перья выразил шов следующим образом:

A seam is a place where you can alter behavior in your program without editing in that place.

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

То, о чем я прошу, - это простой способ работы с издевательствами в различных сценариях. Я не всегда хочу возвращать одно и то же значение в шве, иногда я хочу вернуть null, чтобы получить ошибку, иногда массив с правильными данными, а иногда, возможно, что-то еще.

Спасибо

Ответы [ 3 ]

3 голосов
/ 21 декабря 2011

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

В любом случае, почему этот метод статичен? Будучи защищенным, вы можете вызывать его только из того же класса или его подклассов. Можете ли вы опубликовать больше контекста здесь? Как вы собираетесь его использовать и где вы его протестируете? Можете ли вы изменить его на нестатический?

0 голосов
/ 27 июня 2019

Идея в том, что вы можете подготовить тестируемую версию X, где будет переопределена только одна вещь getMyData:

protected static function getMyData($vars) {
    return $some_dummy_data;
}

Вы пишете тесты для X косвенно через TestX. Теперь давайте предположим, что вы изменили что-то в оригинальном X, что нарушает его. TestX наследует этот неработающий код, поэтому его тесты не пройдены. Именно то, что мы хотели!

0 голосов
/ 22 декабря 2011

Я нашел ответ на свой вопрос здесь:

http://sebastian -bergmann.de / архив / 885-заглушек-Hard-Coded-Dependencies.html

...