作者:1小柱子8_814 | 来源:互联网 | 2023-01-20 17:33
我知道存根验证状态,模拟验证行为.
如何在PHPUnit中进行模拟以验证方法的行为?Phpunit没有验证方法(verify()),而且我不知道如何使moks成为PHPUnit.
在文档中,创建存根很好地解释了:
// Create a stub for the SomeClass class.
$stub = $this->createMock(SomeClass::class);
// Configure the stub.
$stub
->method('doSomething')
->willReturn('foo');
// Calling $stub->doSomething() will now return 'foo'.
$this->assertEquals('foo', $stub->doSomething());
但在这种情况下,我正在验证状态,说回复一个答案.
如何创建模拟和验证行为的示例?
1> Jakub Zalas..:
PHPUnit支持两种创建测试双精度的方法.在传统的PHPUnit模拟框架旁边,它现在支持开箱即用的预言.
PHPUnit模拟框架
该createMock
方法用于创建三个主要已知的测试双精度.这是你配置对象使它成为虚拟,存根或模拟的方式.
您还可以使用模拟构建器创建测试存根(getMockBuilder
返回模拟构建器).这只是做同样事情的另一种方式,它允许您使用流畅的界面调整一些额外的模拟选项(有关更多信息,请参阅文档).
假
虚拟传递,但从未实际调用,或者如果它被调用它响应默认答案(主要是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
未调用该方法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();