热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHPUnit中的MocksvsStubs

如何解决《PHPUnit中的MocksvsStubs》经验,为你挑选了1个好方法。

我知道存根验证状态,模拟验证行为.

如何在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();


推荐阅读
author-avatar
1小柱子8_814
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有