Для объектов, которые составляют другой объект как часть их реализации, каков наилучший способ написания модульного теста, чтобы тестировался только основной объект? Тривиальный пример:
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 зависит от возвращаемых значений. Кроме того, что, если вы хотите протестировать вызовы объекта зависимости так же, как вы можете использовать с фиктивными объектами? Есть ли способ высмеивать объекты, которые создаются SUT, а не передаются?
Я прочитал справочную страницу по макетам, но, похоже, она не охватывает ситуацию, когда зависимость составлена, а не агрегирована. Как ты это делаешь?