我尝试按照AAA模式将规范写入ClassA
。此类与ClassB
的依赖关系将与ClassA
进行交互,如下所示:
class ClassA
{
private $objB;
public function __construct(ClassB $objB)
{
$this->objB = $objB;
}
public function doSomething($arg)
{
$val1 = $this->objB->someMethod($arg);
// do something with variable $val1
$this->objB->otherMethodCall();
}
}
及其规格:
class ClassASpec extends ObjectBehavior
{
function let(ClassB $objB)
{
$this->beConstructedWith($objB);
}
function it_should_do_something_cool(ClassB $objB)
{
// Arrange
$objB->someMethod(10)->willReturn(...);
// Act
$this->doSomething(10);
// Assert
$objB->otherMethodCall()->shouldHaveBeenCalled();
}
}
当我运行此规范时,我收到一条错误消息,指出不希望调用方法ClassB::otherMethodCall()
,只需要ClassB::someMethod()
。
答案 0 :(得分:2)
如果你使用这个断言
// Arrange
$objB->someMethod(10)->willReturn(...);
你的double是一个模拟器,因此被视为模拟器(没有shouldHaveBeen
但只有shouldBe
)
下面
// Assert
$objB->otherMethodCall()->shouldHaveBeenCalled();
你正在对待你的对象,因为它是间谍,事实并非如此。
由于你的double是一个模拟,你应该修改你的代码如下
// Arrange
$objB->someMethod(10)->willReturn(...);
// Assert
$objB->otherMethodCall()->shouldBeCalled();
// Act
$this->doSomething(10);