mnapoli / mockup
PHP 测试的简洁模拟库
0.1.0
2016-03-25 17:14 UTC
Requires
- php: ^5.5|^7.0
- ocramius/proxy-manager: ^1.0
Requires (Dev)
- phpunit/phpunit: ~4.8
This package is auto-updated.
Last update: 2024-09-19 20:18:31 UTC
README
PHP 测试的简洁模拟库。
为什么?
这个模拟库旨在作为一个简单但功能强大的替代品。
- Mockup
$mock = mock(Foo::class, [ 'foo' => 'Hello', ]);
- PHPUnit
$mock = $this->getMock(Foo::class, [], [], '', false); $mock->expect($this->any()) ->method('foo') ->willReturn('Hello');
- Prophecy
$prophet = new \Prophecy\Prophet(); $mock = $prophet->prophesize(Foo::class); $mock->foo()->willReturn('Hello'); $mock = $mock->reveal();
- Mockery
$mock = Mockery::mock(Foo::class); $mock->shouldReceive('foo') ->andReturn('Hello');
此外,Mockup 不包含断言。它不是强迫你学习一种特定的断言语法,这种语法足以覆盖所有情况,而是允许你使用你已知的断言(PHPUnit,phpspec,……)。以下是一个PHPUnit测试的示例
// The mock method was called once $this->assertEquals(1, inspect($mock)->foo()->invokationCount());
下面将详细介绍监视方法调用。
安装
composer require --dev mnapoli/mockup
用法
模拟
你可以模拟一个类或一个接口
use function Mockup\mock; interface Foo { public function foo($bar); } $mock = mock(Foo::class); $mock->foo();
它的所有方法将不会做任何事情并返回 null
(空对象模式)。模拟将实现给定的接口或扩展给定的类,因此它将与任何类型提示一起正常工作。
你可以使某些方法返回除了null之外的其他值
$mock = mock(Foo::class, [ 'foo' => 'hello', ]); $mock->foo('john'); // hello
你也可以使用闭包来定义新方法的内容
$mock = mock(Foo::class, [ 'foo' => function ($bar) { return strtoupper('hello ' . $bar); } ]); $mock->foo('john'); // HELLO JOHN
间谍
你可以监视对象的调用
use function Mockup\{spy, inspect}; $spy = spy($cache); $foo->doSomething($spy); inspect($spy)->set()->invokationCount(); // number of calls to $spy->set() inspect($spy)->set()->parameters(0); // parameters provided to the first call to $spy->set() inspect($spy)->set()->returnValue(0); // value returned by the first call to $spy->set()
与模拟的区别在于你正在监视对真实对象的实际调用。模拟是一个 空对象。
Mockup 不提供断言或期望,以便你可以使用你喜欢的断言库。
每个模拟对象也是一个间谍,因此你可以创建一个模拟并监视其方法调用
use function Mockup\{mock, inspect}; $mock = mock(CacheInterface::class); $foo->doSomething($mock); inspect($spy)->set()->invokationCount(); inspect($spy)->set()->parameters(0); inspect($spy)->set()->returnValue(0);