Arrange/Act/Assert 使用 PHPSpec 的模式

Arrange/Act/Assert pattern using PHPSpec

我正在尝试遵循 AAA 模式来为 ClassA 编写规范。此 class 与 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() 被期望。

如果你使用这个断言

// Arrange
$objB->someMethod(10)->willReturn(...);

你的替身是一个模拟,因此被视为模拟(没有 shouldHaveBeen 但只有 shouldBe

这里

// Assert
$objB->otherMethodCall()->shouldHaveBeenCalled();

您将您的对象视为间谍,事实并非如此。

由于你的替身是一个模拟,你应该修改你的代码如下

// Arrange
$objB->someMethod(10)->willReturn(...);

// Assert
$objB->otherMethodCall()->shouldBeCalled();

// Act
$this->doSomething(10);

要了解模拟、间谍和存根之间的区别,请阅读 prophecy and phpspec 文档