Как бы вы заглушили DTO, который также содержит некоторую логику (что в любом случае делает его больше, чем DTO)? Вы бы даже заглушить его? Рассмотрим этот простой пример:
class Context
{
/**
* @var string
*/
private $value;
function __construct($value)
{
$this->value = $value;
}
public function getValue()
{
return $this->value;
}
public function setValue($value)
{
$this->value = $value;
}
/*
* Some logic that we assume belong here
*/
}
class Interpreter
{
public function interpret(Context $context)
{
$current_context = $context->getValue();
if(preg_match('/foo/', $current_context ))
{
$context->setValue(str_replace('foo', 'bar', $current_context));
$this->interpret();
}
return $context->getValue();
}
}
Теперь модульное тестирование Interpreter
в стиле PHPSpec:
class InterpreterSpec
{
function it_does_something_cool_to_a_context_stub(Context $context)
{
$context->getValue()->shouldReturn('foo foo');
$this->intepret($context)->shouldReturn("bar bar");
}
}
Очевидно, это создаст бесконечный цикл. Как бы вы провели модульное тестирование интерпретатора? Я имею в виду, что если бы вы просто передали ему «настоящий» экземпляр Context
, вы бы полагались на поведение этого объекта, и на самом деле это не было бы модульным тестом.