PHPUnit 曾经支持两种开箱即用的创建测试替身的方法。在遗留的 PHPUnit 模拟框架旁边,我们也可以选择预言。
在 PHPUnit 9 中删除了预言支持,但可以通过安装 phpspec/prophecy-phpunit 重新添加。
PHPUnit 模拟框架
createMock 方法用于创建三个最知名的测试替身。这是您配置对象的方式,使其成为虚拟对象、存根或模拟对象。
您还可以使用模拟构建器创建测试存根(getMockBuilder 返回模拟构建器)。这只是做同样事情的另一种方式,让您可以使用流畅的界面调整一些额外的模拟选项(请参阅the documentation 了解更多信息)。
假人
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);
模拟
Mocks 与类似命令的方法一起使用 - 调用它们很重要,而且我们不太关心它们的返回值(命令方法通常不返回任何值)。
$mock = $this->createMock(SomeClass::class);
$mock->expects($this->once())
->method('doSomething')
->with('bar');
$sut->action($mock);
在您的测试方法完成执行后,将自动验证预期。在上面的示例中,如果 doSomething 方法没有在 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();