jasonmccreary / test-double
Requires
- mockery/mockery: >0.8.0
Requires (Dev)
- phpunit/phpunit: ^6.4
This package is auto-updated.
Last update: 2024-09-06 17:33:43 UTC
README
厌倦了在Mockery中记住mocks、partials和spies之间的区别?我也是,这就是为什么我创建了double()
- 一个简单的辅助方法,可以让使用Mockery变得更加容易。
在编写测试时,我不想考虑假、mocks和spies之间的区别。我只想创建一个通用的test double,并专注于编写我的测试。这种泛化在其他的测试框架中也很常见,比如 RSpec、td.js 等。
安装
要安装最新的double()
辅助方法,请运行以下命令
composer require --dev jasonmccreary/test-double
用法
在需要创建一个test double时,只需调用double()
默认情况下,double()
返回一个对象,该对象允许您进行方法存根以及验证方法调用。
<?php $td = double(); $td->shouldReceive('someMethod')->andReturn(5); $td->someMethod(); // returns 5 $td->unstubbedMethod(); // returns null, does not throw an exception $td->anotherMethod(); $td->shouldHaveReceived('anotherMethod');
在Mockery中,这个test double等同于Mockery::mock()->shouldIgnoreMissing()
,或者在较新版本中,等同于Mockery::spy()
。
您还可以向double()
传递一个类或接口的引用。这将创建一个扩展该类或实现该接口的测试对象。这允许double通过实现中的任何类型提示或类型检查。
<?php $td = double(Str::class); $td->shouldReceive('length')->andReturn(5); $td->length(); // 5 $td->substr(1, 3); // null $td instanceof Str; // true $td->shouldHaveReceived('substr')->with(1, 3);
最后,double()
接受一个名为passthru的第二个参数。默认情况下,passthru是false
。当设置为true
时,测试对象将传递任何方法调用到底层对象。
在Mockery中,这等同于Mockery::mock(Number::class)->shouldDeferMissing()
。
<?php class Number { public function one() { return 1; } public function random() { return 5; } } $td = double(Number::class, true); $td->shouldReceive('random')->andReturn(21); $td->random(); // 21 $td->one(); // 1 $td instanceof Number; // true $td->shouldHaveReceived('one');
注意:passthru只能在创建带有类引用的测试double时使用,因为只有在这种情况下才存在底层实现。
最终,double()
是一种有见地的创建底层代码测试对象的方法。如果它不能满足您的需求,您始终可以直接创建Mockery::mock()
。然而,这样做可能意味着您正在以不符合真实世界行为的方式测试实现。请记住,double()
返回一个实现了MockeryInterface
的对象。因此,它可以被视为任何其他的Mockery::mock()
对象。