Lzh on GitHub

快速参考

本页旨在快速简要概述一些最常见的 Mockery 功能。

本页旨在快速简要概述一些最常见的 Mockery 功能。

请务必阅读 参考 以了解所有 Mockery 功能。

MockeryPHPUnit 集成,可以通过扩展 MockeryTestCase

use \Mockery\Adapter\Phpunit\MockeryTestCase;

class MyTest extends MockeryTestCase
{
}

或者通过使用 MockeryPHPUnitIntegration trait:

use \PHPUnit\Framework\TestCase;
use \Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;

class MyTest extends TestCase
{
    use MockeryPHPUnitIntegration;
}

创建测试替身:

$testDouble = \Mockery::mock('MyClass');

创建实现某个接口的测试替身:

$testDouble = \Mockery::mock('MyClass, MyInterface');

期望测试替身上的某个方法被调用:

$testDouble = \Mockery::mock('MyClass');
$testDouble->shouldReceive('foo');

期望测试替身上的某个方法不被调用:

$testDouble = \Mockery::mock('MyClass');
$testDouble->shouldNotReceive('foo');

期望测试替身上的某个方法被调用一次,带有一个特定的参数,并返回一个值:

$mock = \Mockery::mock('MyClass');
$mock->shouldReceive('foo')
    ->once()
    ->with($arg)
    ->andReturn($returnValue);

期望测试替身上的某个方法为每个连续的调用返回不同的值:

$mock = \Mockery::mock('MyClass');
$mock->shouldReceive('foo')
    ->andReturn(1, 2, 3);
$mock->foo(); // int(1);
$mock->foo(); // int(2);
$mock->foo(); // int(3);
$mock->foo(); // int(3);

创建运行时部分测试替身:

$mock = \Mockery::mock('MyClass')->makePartial();

创建一个间谍:

$spy = \Mockery::spy('MyClass');

期望一个间谍应该已经收到了一个方法调用:

$spy = \Mockery::spy('MyClass');
$spy->foo();
$spy->shouldHaveReceived()->foo();

不那么简单的例子

创建一个模拟对象,使其从一组方法调用中返回一系列值:

use \Mockery\Adapter\Phpunit\MockeryTestCase;

class SimpleTest extends MockeryTestCase
{
    public function testSimpleMock()
    {
        $mock = \Mockery::mock(array('pi' => 3.1416, 'e' => 2.71));
        $this->assertEquals(3.1416, $mock->pi());
        $this->assertEquals(2.71, $mock->e());
    }
}

创建一个模拟对象,使其为方法调用返回一个自链接的 Undefined 对象:

use \Mockery\Adapter\Phpunit\MockeryTestCase;

class UndefinedTest extends MockeryTestCase
{
    public function testUndefinedValues()
    {
        $mock = \Mockery::mock('mymock');
        $mock->shouldReceive('divideBy')->with(0)->andReturnUndefined();
        $this->assertTrue($mock->divideBy(0) instanceof \Mockery\Undefined);
    }
}

创建一个具有多个查询调用和单个更新调用的模拟对象:

use \Mockery\Adapter\Phpunit\MockeryTestCase;

class DbTest extends MockeryTestCase
{
    public function testDbAdapter()
    {
        $mock = \Mockery::mock('db');
        $mock->shouldReceive('query')->andReturn(1, 2, 3);
        $mock->shouldReceive('update')->with(5)->andReturn(NULL)->once();

        // ... 在这里使用模拟对象的测试代码
    }
}

期望所有查询(query)都在任何更新(update)之前执行:

use \Mockery\Adapter\Phpunit\MockeryTestCase;

class DbTest extends MockeryTestCase
{
    public function testQueryAndUpdateOrder()
    {
        $mock = \Mockery::mock('db');
        $mock->shouldReceive('query')->andReturn(1, 2, 3)->ordered();
        $mock->shouldReceive('update')->andReturn(NULL)->once()->ordered();

        // ... 在这里使用模拟对象的测试代码
    }
}

创建一个模拟对象,其中所有查询(query)都发生在启动(startup)之后但在完成(finish)之前,并且期望查询具有几个不同的参数:

use \Mockery\Adapter\Phpunit\MockeryTestCase;

class DbTest extends MockeryTestCase
{
    public function testOrderedQueries()
    {
        $db = \Mockery::mock('db');
        $db->shouldReceive('startup')->once()->ordered();
        $db->shouldReceive('query')->with('CPWR')->andReturn(12.3)->once()->ordered('queries');
        $db->shouldReceive('query')->with('MSFT')->andReturn(10.0)->once()->ordered('queries');
        $db->shouldReceive('query')->with(\Mockery::pattern("/^....$/"))->andReturn(3.3)->atLeast()->once()->ordered('queries');
        $db->shouldReceive('finish')->once()->ordered();

        // ... 在这里使用模拟对象的测试代码
    }
}