PHPUnit 过去支持两种开箱即用的创建测试替身的方法。在遗留的 PHPUnit 模拟框架旁边,我们也可以选择预言。
PHPUnit 9 中删除了预言支持,但可以通过安装phpspec/prophecy-phpunit
.
PHPUnit 模拟框架
该createMock
方法用于创建三个最知名的测试替身。这是您配置对象的方式,使其成为虚拟对象、存根或模拟对象。
您还可以使用模拟构建器创建测试存根(getMockBuilder
返回模拟构建器)。这只是做同样事情的另一种方式,让您可以使用流畅的界面调整一些额外的模拟选项(有关更多信息,请参阅文档)。
假的
Dummy 被传递,但从未真正被调用,或者如果它被调用,它会以默认答案响应(主要是null
)。它的存在主要是为了满足一系列参数。
$dummy = $this->createMock(SomeClass::class);
// SUT - System Under Test
$sut->action($dummy);
存根
存根与类似查询的方法一起使用——返回事物的方法,但它们是否被实际调用并不重要。
$stub = $this->createMock(SomeClass::class);
$stub->method('getSomething')
->willReturn('foo');
$sut->action($stub);
嘲笑
模拟与类似命令的方法一起使用 - 调用它们很重要,我们不太关心它们的返回值(命令方法通常不返回任何值)。
$mock = $this->createMock(SomeClass::class);
$mock->expects($this->once())
->method('doSomething')
->with('bar');
$sut->action($mock);
在您的测试方法完成执行后,将自动验证预期。doSomething
在上面的示例中,如果方法没有被调用 on SomeClass
,或者使用与您配置的参数不同的参数调用它,则测试将失败。
间谍
不支持。
预言
PHPUnit 现在开箱即用地支持 Prophecy,因此您可以将其用作传统模拟框架的替代方案。同样,您配置对象的方式使其成为特定类型的测试替身。
假的
$dummy = $this->prophesize(SomeClass::class);
$sut->action($dummy->reveal());
存根
$stub = $this->prophesize(SomeClass::class);
$stub->getSomething()->willReturn('foo');
$sut->action($stub->reveal());
嘲笑
$mock = $this->prophesize(SomeClass::class);
$mock->doSomething('bar')->shouldBeCalled();
$sut->action($mock->reveal());
间谍
$spy = $this->prophesize(SomeClass::class);
// execute the action on system under test
$sut->action($spy->reveal());
// verify expectations after
$spy->doSomething('bar')->shouldHaveBeenCalled();