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


person rdiz    schedule 30.03.2015    source источник
comment
Ваш пример немного абстрактен, но похоже, что вы пытаетесь поместить поведение в неправильный класс.   -  person Jakub Zalas    schedule 31.03.2015
comment
Я в основном создаю что-то, что следует шаблону интерпретатора, что означает, что объект Context мутирует. Итак, в основном мой вопрос: при модульном тестировании должен ли я издеваться над объектом передачи данных или просто создавать экземпляр? Если подумать, то попытка заглушить DTO является довольно четким сигналом того, что он содержит некоторую логику, которой не должен.   -  person rdiz    schedule 31.03.2015


Ответы (1)


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

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

        $this->intepret($context)->shouldReturn("bar bar");
    }
}
person user1777136    schedule 03.04.2015