PHPUnit曾经支持两种创建测试替身的方式,除了传统的PHPUnit mocking框架外,我们还可以选择使用Prophecy。
PHPUnit 9中删除了对Prophecy的支持,但是可以通过安装phpspec/prophecy-phpunit
来重新添加支持。
PHPUnit Mocking Framework
createMock
方法用于创建三种常见的测试替身。通过配置对象,可以将其配置为dummy、stub或mock。
您还可以使用mock builder创建测试stubs(getMockBuilder
返回mock builder)。这只是另一种做同样事情的方法,它允许您使用流畅的接口调整一些额外的mock选项(有关更多信息,请参见文档)。
Dummy
Dummy参数被传递,但从未实际调用,或者如果被调用,则会响应默认答案(大多数情况下为 null
)。它主要存在以满足参数列表。
$dummy = $this->createMock(SomeClass::class);
$sut->action($dummy);
桩(Stub)
桩通常用于查询类的方法 - 即返回结果的方法,但其是否实际调用并不重要。
$stub = $this->createMock(SomeClass::class);
$stub->method('getSomething')
->willReturn('foo');
$sut->action($stub);
Mock
Mock用于命令式的方法 - 重要的是它们被调用,而我们并不太关心它们的返回值(命令式方法通常不返回任何值)。
$mock = $this->createMock(SomeClass::class);
$mock->expects($this->once())
->method('doSomething')
->with('bar');
$sut->action($mock);
在您的测试方法执行完毕后,预期结果将自动进行验证。在上面的示例中,如果在SomeClass
上未调用方法doSomething
,或者使用与配置的参数不同的参数进行了调用,则测试将失败。
Spy
不支持。
Prophecy
现在PHPUnit已经原生支持Prophecy,因此您可以将其作为传统Mocking框架的替代方案使用。同样,对象的配置方式决定了它是哪一种类型的测试Double。
Dummy
$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);
$sut->action($spy->reveal());
$spy->doSomething('bar')->shouldHaveBeenCalled();