使用PHPSpec排列/动作/断言模式

时间:2016-10-18 00:46:46

标签: php phpspec

我尝试按照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()

1 个答案:

答案 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);

要了解嘲笑,间谍和存根之间的区别,请阅读prophecyphpspec文档