在 PHPSpec(或任何单元测试框架)中存根有状态对象
Stubbing a stateful object in PHPSpec (or any unit testing framework)
您将如何对还包含一些逻辑的 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();
}
}
现在,以 PHPSpec 方式进行单元测试 Interpreter
:
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
的 "real" 实例传递给它,您将依赖于该对象的行为,并且它不会真正成为单元测试。
根据我在您的代码中看到的内容,我不会伪造上下文,而是使用真实的上下文。据我所知,它是一个值对象,只有 getter 和 setter 被访问。
class InterpreterSpec
{
function it_does_something_cool_to_a_context_stub()
{
$context = new Context("foo foo");
$this->intepret($context)->shouldReturn("bar bar");
}
}
您将如何对还包含一些逻辑的 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();
}
}
现在,以 PHPSpec 方式进行单元测试 Interpreter
:
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
的 "real" 实例传递给它,您将依赖于该对象的行为,并且它不会真正成为单元测试。
根据我在您的代码中看到的内容,我不会伪造上下文,而是使用真实的上下文。据我所知,它是一个值对象,只有 getter 和 setter 被访问。
class InterpreterSpec
{
function it_does_something_cool_to_a_context_stub()
{
$context = new Context("foo foo");
$this->intepret($context)->shouldReturn("bar bar");
}
}