Rod*_*ing 10 testing phpunit unit-testing mocking stubs
我知道存根验证状态,模拟验证行为.
如何在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());
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,我正在验证状态,说回复一个答案.
如何创建模拟和验证行为的示例?
Jak*_*las 40
PHPUnit支持两种创建测试双精度的方法.在传统的PHPUnit模拟框架旁边,它现在支持开箱即用的预言.
该createMock方法用于创建三个主要已知的测试双精度.这是你配置对象使它成为虚拟,存根或模拟的方式.
您还可以使用模拟构建器创建测试存根(getMockBuilder返回模拟构建器).这只是做同样事情的另一种方式,它允许您使用流畅的界面调整一些额外的模拟选项(有关更多信息,请参阅文档).
虚拟传递,但从未实际调用,或者如果它被调用它响应默认答案(主要是null).它主要用于满足参数列表.
$dummy = $this->createMock(SomeClass::class);
// SUT - System Under Test
$sut->action($dummy);
Run Code Online (Sandbox Code Playgroud)
存根与查询类似的方法一起使用 - 返回事物的方法,但如果它们实际被调用则不重要.
$stub = $this->createMock(SomeClass::class);
$stub->method('getSomething')
->willReturn('foo');
$sut->action($stub);
Run Code Online (Sandbox Code Playgroud)
模拟与命令类似的方法一起使用 - 调用它们很重要,我们并不关心它们的返回值(命令方法通常不会返回任何值).
$mock = $this->createMock(SomeClass::class);
$mock->expects($this->once())
->method('doSomething')
->with('bar');
$sut->action($mock);
Run Code Online (Sandbox Code Playgroud)
测试方法执行完毕后,将自动验证期望值.在上面的示例中,如果doSomething未调用该方法SomeClass,或者使用与您配置的参数不同的参数调用它,则测试将失败.
不支持.
PHPUnit现在支持Prophecy开箱即用,因此您可以将其用作传统模拟框架的替代方案.同样,它是您配置对象的方式使它成为测试双精度的特定类型.
$dummy = $this->prophesize(SomeClass::class);
$sut->action($dummy->reveal());
Run Code Online (Sandbox Code Playgroud)
$stub = $this->prophesize(SomeClass::class);
$stub->getSomething()->willReturn('foo');
$sut->action($stub->reveal());
Run Code Online (Sandbox Code Playgroud)
$mock = $this->prophesize(SomeClass::class);
$mock->doSomething('bar')->shouldBeCalled();
$sut->action($mock->reveal());
Run Code Online (Sandbox Code Playgroud)
$spy = $this->prophesize(SomeClass::class);
// execute the action on system under test
$sut->action($spy->reveal());
// verify expectations after
$spy->doSomething('bar')->shouldHaveBeenCalled();
Run Code Online (Sandbox Code Playgroud)
假人
首先,看看假人。虚拟对象既是我看起来的样子,如果你让我记住我把车钥匙放在哪里......也是你在 phpspec 中添加带有类型提示的参数以获得测试替身时得到的对象......然后绝对不做任何事。因此,如果我们得到一个测试替身,并且不添加任何行为,也不对其方法做出任何断言,那么它就被称为“虚拟对象”。
哦,在他们的文档中,您会看到类似 $prophecy->reveal() 的内容。这是我们不需要担心的细节,因为 phpspec 会为我们处理这个问题。分数!
存根
一旦您开始控制甚至一种方法的一个返回值……繁荣!这个对象突然被称为存根。从文档中:“存根是一个对象双精度” - 所有这些东西都被称为测试双精度或对象双精度 - 当放入特定环境时,以特定方式表现。这是一种奇特的说法:一旦我们添加了其中一个 willReturn() 东西,它就变成了一个存根。
实际上,大部分文档都在讨论存根以及精确控制其行为方式的不同方法,包括我们之前看到的参数通配符。
模拟
如果你继续往下读,你会发现下一个是“mocks”。当你调用 shouldBeCalled() 时,一个对象就变成了一个模拟对象。因此,如果您想添加一个方法被调用一定次数的断言,并且您想将该断言放在实际代码之前 - 使用 shouldBeCalledTimes() 或 shouldBeCalled() - 恭喜!您的对象现在称为模拟对象。
间谍
最后,在底层,我们有间谍。间谍与模拟完全相同,只不过是在代码后添加期望 - 就像使用 shouldHaveBeenCalledTimes() 一样。
https://symfonycasts.com/screencast/phpspec/doubles-dummies-mocks-spies
| 归档时间: |
|
| 查看次数: |
7477 次 |
| 最近记录: |