gpt4 book ai didi

unit-testing - PHPUnit 中的模拟与 stub

转载 作者:行者123 更新时间:2023-11-28 19:41:34 25 4
gpt4 key购买 nike

我知道 stub 验证状态而模拟验证行为。

如何在 PHPUnit 中创建一个模拟来验证方法的行为? PHPUnit 没有验证方法 (verify()),而且我不知道如何在 PHPUnit 中进行模拟。

在文档中,对创建 stub 有很好的解释:

// 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());

但在这种情况下,我正在验证状态,即返回一个答案。

如何创建模拟和验证行为的示例?

最佳答案

PHPUnit 过去支持两种开箱即用的创建测试替身的方法。除了遗留的 PHPUnit 模拟框架,我们还可以选择 prophecy。

预言支持在 PHPUnit 9 中被移除,但可以通过安装 phpspec/prophecy-phpunit 重新添加.

PHPUnit 模拟框架

createMock 方法用于创建三个最知名的测试替身。这是您配置对象的方式,使它成为虚拟对象、 stub 或模拟对象。

您还可以使用模拟生成器创建测试 stub (getMockBuilder 返回模拟生成器)。这只是做同样事情的另一种方式,让您可以通过流畅的界面调整一些额外的模拟选项(有关更多信息,请参见 the documentation)。

虚拟

Dummy 被传递,但从未真正被调用,或者如果它被调用,它会以默认答案响应(主要是 null)。它的存在主要是为了满足参数列表。

$dummy = $this->createMock(SomeClass::class);

// SUT - System Under Test
$sut->action($dummy);

stub

stub 与类似查询的方法一起使用 - 返回内容的方法,但它们是否被实际调用并不重要。

$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 上调用,或者调用时使用的参数与您配置的参数不同,则测试将失败。

spy

不支持。

预言

Prophecy 现在由 PHPUnit 开箱即用地支持,因此您可以将其用作遗留模拟框架的替代品。同样,这是您配置对象的方式使它成为特定类型的测试替身。

虚拟

$dummy = $this->prophesize(SomeClass::class);

$sut->action($dummy->reveal());

stub

$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

$spy = $this->prophesize(SomeClass::class);

// execute the action on system under test
$sut->action($spy->reveal());

// verify expectations after
$spy->doSomething('bar')->shouldHaveBeenCalled();

关于unit-testing - PHPUnit 中的模拟与 stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45965699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com