mnapoli/mockup

PHP 测试的简洁模拟库

0.1.0 2016-03-25 17:14 UTC

This package is auto-updated.

Last update: 2024-09-19 20:18:31 UTC


README

PHP 测试的简洁模拟库。

Build Status

为什么?

这个模拟库旨在作为一个简单但功能强大的替代品。

  • 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);