快速参考
本页旨在快速简要概述一些最常见的 Mockery 功能。
本页旨在快速简要概述一些最常见的 Mockery 功能。
请务必阅读 参考 以了解所有 Mockery 功能。
将 Mockery 与 PHPUnit 集成,可以通过扩展 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();
// ... 在这里使用模拟对象的测试代码
}
}