Comments 15
Элегантно. Я вижу только один недостаток: после прогона теста в пространстве имен остается новая функция. Все будет хорошо, пока два разных теста в пределах одного неймспейса не захотят «замокать» функцию каждый по-своему.
+3
Впрочем, наверняка можно как-то красиво и этот вопрос решить.
0
Я обычно выношу все подобные моки в отдельный файл (как helpers.php в примере), который подключается всеми заинтересованными тестами. Ну и внутри моков функций используется более сложная логика, покрывающая все потребности тестов. Тут уже всё зависит от сложности тестирования. Можно сделать класс со статическими членами, который будет и возвращать значения для моков функций, и вбрасывать исключения, и хранить историю вызовов. Всё ограничивается только фантазией программиста.
0
Тест после выполнения должен оставлять тестируемую систему ровно в том же виде, какой она была до запуска теста. В предложенном способе это условие нарушается, насколько я понимаю.
+1
Почему? Вспомогательный класс не является частью тестируемой системы. Фактически это дополнение к классам PHPUnit.
0
Набор функций внутри неймспейса, в котором находится тестируемый класс, на мой взгляд является частью тестируемой системы. И этот набор меняется, когда тест завершает работу, т.к. в нем появляются новые функции.
0
Я не вижу в этом ничего страшного, если писать тесты с умом и не м́очить все функции подряд.
0
Тестируемая система не при чём.
Пространство имён определено в двух местах, в данном случае:
— в хелпере и самом тесте.
Хелпер подключается к тесту, для него и создан.
Каким образом это повлияет на систему?
Пространство имён определено в двух местах, в данном случае:
— в хелпере и самом тесте.
Хелпер подключается к тесту, для него и создан.
Каким образом это повлияет на систему?
0
Красивое решение. Имеет полное право быть.
Возможно при реализации вылезут какие-то специфические проблемы, но хотя бы попробовать такое решение стоит.
Спасибо.
Возможно при реализации вылезут какие-то специфические проблемы, но хотя бы попробовать такое решение стоит.
Спасибо.
-1
Да, это интересный подход. Есть еще один вариант — поставить на девелоп сервер APD. В нем есть функция переименования любой объявленной функции, даже системной. В итоге, мы можем делать что-то вроде
В итоге во всем проекте все функции можно так вот прогонять через свои…
rename_function('fsockopen', '__dbg__fscokopen' );
function fscokopen(){
// тут код для теста
// вызов __dbg__fscokopen()
// еще что-то...
}
В итоге во всем проекте все функции можно так вот прогонять через свои…
+1
Описание функции www.php.net/manual/en/function.rename-function.php
0
А как у APD обстоят дела с совместимостью с 5.3.3?
0
Красиво. Спасибо. С тестовыми данными, правда, надо подумать, чтобы это не превратилось в страшную кашу. Но, все равно, красиво.
0
Не могу понять как просто переопределить глобальную функцию в одном файле, чтобы это действовал на все подключаемые файлы. Или это невозможно будет сделать с помощью use в одном файле?
Пробую pastebin.com/B1FBgVLU, но в этом случае переопределённая функция не вызывается.
Пробую pastebin.com/B1FBgVLU, но в этом случае переопределённая функция не вызывается.
0
Sign up to leave a comment.
Пространства имён + PHPUnit = 100% покрытие тестами