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);
我正在尝试遵循 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);