jasonmccreary/test-double

安装: 5

依赖: 0

建议: 0

安全: 0

星标: 12

关注者: 2

分支: 0

开放问题: 0

类型:供应商

dev-master 2017-11-14 16:00 UTC

This package is auto-updated.

Last update: 2024-09-06 17:33:43 UTC


README

厌倦了在Mockery中记住mocks、partials和spies之间的区别?我也是,这就是为什么我创建了double() - 一个简单的辅助方法,可以让使用Mockery变得更加容易。

在编写测试时,我不想考虑mocksspies之间的区别。我只想创建一个通用的test double,并专注于编写我的测试。这种泛化在其他的测试框架中也很常见,比如 RSpectd.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的第二个参数。默认情况下,passthrufalse。当设置为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()对象。