Позвольте мне начать со слов: добро пожаловать на темную сторону модульного тестирования.
Значение: Вы обычно не хотите этого делать, но, как вы объяснили, у вас есть то, что кажется правильным вариантом использования.
runkit
То, что вы можете сделать довольно легко, не так просто, как изменение архитектуры вашего приложения, - это изменить поведение класса на лету с помощью runkit
runkit_method_rename(
get_class($object), 'methodToMock', 'methodToMock_old'
);
runkit_method_add(
get_class($object), 'methodToMock', '$param1, $param2', 'return 7;'
);
runkit :: method_add
и после теста к method_remove и переименованию снова.Я не знаю ни одного фреймворка / компонента, который бы вам в этом помог, но это не так уж много для самостоятельной реализации в UglyTestsBaseTest extends PHPUnit_Framework_TestCase
.
Ну ...
Если всеиметь доступ к является ссылкой на этот объект (как в: $x
в $x = new Foo();
), я не знаю, как сказать: $ x, вы сейчас типа SomethingElse
и все другие переменные, указывающие наэтот объект тоже должен измениться.
Я предполагаю, что вы уже знаете такие вещи, как тестирование ваших рядовых , но это не поможет вам, потому что вы не можете контролировать жизненный цикл объектов .
Расширение помощников по тестированию php
Примечание: расширение Test-Helper заменено наhttps://github.com/krakjoe/uopz
Здесь вам также могут помочь: Использование жестко закодированных зависимостей с использованием расширения php-test-helpers , что позволяет вам делать такие вещи, как Перехват создания объектов .
Это означает, что когда ваше приложение вызывает$x = new Something();
вы можете взломать PHP, чтобы сделать так, чтобы $x
содержал экземпляр YourSpecialCraftedSomething
.
. Вы можете создать эту классификацию, используя PHPUnit Mocking API, или написать ее самостоятельно.
Насколько я знаю, это ваши варианты.Если вам стоит пойти туда (или просто написать тесты на интеграцию / селен для этого проекта), вы должны сами в этом разобраться, так как это сильно зависит от ваших обстоятельств.