Для объектов, которые составляют другой объект как часть их реализации, как лучше всего написать модульный тест, чтобы тестировался только основной объект? Тривиальный пример:
class myObj {
public function doSomethingWhichIsLogged()
{
// ...
$logger = new logger('/tmp/log.txt');
$logger->info('some message');
// ...
}
}
Я знаю, что объект может быть спроектирован так, чтобы зависимость объекта регистратора могла быть введена и, следовательно, смоделирована в модульном тесте, но это не всегда так — в более сложных сценариях вам нужно создавать другие объекты или вызывать статические методы. .
Поскольку мы не хотим тестировать объект логгера, а только myObj, что нам делать дальше? Мы создаем заглушенный «двойник» с тестовым скриптом? Что-то типа:
class logger
{
public function __construct($filepath) {}
public function info($message) {}
}
class TestMyObj extends PHPUnit_Framework_TestCase
{
// ...
}
Это кажется выполнимым для небольших объектов, но будет проблемой для более сложных API, где ТРИ зависит от возвращаемых значений. Кроме того, что, если вы хотите протестировать вызовы объекта зависимости так же, как и с фиктивными объектами? Есть ли способ издеваться над объектами, которые создаются SUT, а не передаются?
Я прочитал справочную страницу по макетам, но, похоже, она не охватывает эту ситуацию, когда зависимость составляется, а не агрегируется. Как ты сделал это?