Заглушка объекта с состоянием в PHPSpec (или в любой платформе модульного тестирования)

Как бы вы пошли на заглушку 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В этом случае вы полагаетесь на поведение объектов, и это не будет модульный тест.

0

Решение

Исходя из того, что я вижу в вашем коде, я бы не подделывал контекст, а работал с реальным. Насколько я вижу, это объект значения, к которому обращаются только getter и setter.

class InterpreterSpec
{
function it_does_something_cool_to_a_context_stub()
{
$context = new Context("foo foo");

$this->intepret($context)->shouldReturn("bar bar");
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]