PhpSpec预期呼叫准确

时间:2014-10-28 10:06:32

标签: unit-testing phpspec laravel-5

我有一个Laravel5应用程序的方法我尝试在PhpSpec中测试,但它不断抛出以下错误:

App/Helpers/RecurrRule                              
37  ! it should return a recurrence collection method call:
    Double\ChurchRepositoryInterface\P6->getChurchTimezone(1) was not expected.
    Expected calls are:
    - getChurchTimeZone(exact(1))

该方法传递给一个数组,我想模仿该模型的getChurchTimezone方法返回一个时区。

方法:

public function __construct(Rule $rule, ArrayTransformer $arrayTransformer, ChurchRepositoryInterface $church)
{
    $this->rule = $rule;
    $this->arrayTransformer = $arrayTransformer;
    $this->church = $church;
}


public function getRecurrenceCollection($schedule)
{
    $timezone    = $this->church->getChurchTimezone($schedule['church_id']);
    // more code
}

在我的其他规格中,我经常做$double->method('someArgument')->willReturn('blah')之类的事情,但由于某种原因,这个具体案例并不起作用,我对此感到困惑。

我试过给它一个数组副本,我试过直接给它一个整数,我试着将$ this-> church-> getChurchTimezone拉到自己的方法中并传递给它数组或整数,但无论PhpSpec总是带回一个'确切的'在预期的呼叫错误。

规格:

class RecurrRuleSpec extends ObjectBehavior
{

    protected $schedule = [
        'church_id' => 1,
        'start' => '2014-11-21 10:36:07',
        'end' => '2014-11-21 11:36:07',
        'recurr_rule' => 'FREQ=WEEKLY;BYDAY=SU;',
        'recurr_until' => '2015-02-22 10:36:07',
    ];

    function it_is_initializable()
    {
        $this->shouldHaveType('App\Helpers\RecurrRule');
    }

    /**
     * Setup our mock, with doubles matching our constructor
     */
    function let($rule, $arrayTransformer, $church)
    {
        $rule->beADoubleOf('\Recurr\Rule');
        $arrayTransformer->beADoubleOf('\Recurr\Transformer\ArrayTransformer');
        $church->beADoubleOf('\App\Repositories\ChurchRepositoryInterface');

        $this->beConstructedWith($rule, $arrayTransformer, $church);
    }

    function it_should_return_a_recurrence_collection($rule, $arrayTransformer, $church)
    {
        $church->getChurchTimeZone(1)->willReturn('Europe/Dublin');
        // $church->getChurchTimeZone($this->schedule['church_id'])->willReturn('Europe/Dublin');
        // $church->getChurchTimeZone(Argument::any())->willReturn('Europe/Dublin');
        $rule->createFromString()->willReturn([]);
        $arrayTransformer->transform()->willReturn([]);


        $this->getRecurrenceCollection($this->schedule)->shouldReturn([]);
    }

这是我的应用中其他地方使用相同方法并传递

的规范的另一个示例
function it_should_return_a_one_dimensional_numeric_array_of_servers($config)
{

    $expectedResult = ['domain.com', 'domain2.com'];

    $config->get('servers')->willReturn($this->configGetReturn);
    $this->serverArray()->shouldBeArray();
    $this->serverArray()->shouldEqual($expectedResult);
}

1 个答案:

答案 0 :(得分:0)

您在规范和代码中拼写的方法名称有所不同: getChurchTimeZone / getChurchTimezone

线索确实出现在错误消息中:

getChurchTimezone(1) was not expected.

Expected calls are:
- getChurchTimeZone(exact(1))

顺便说一句,你可以通过编写像这样的let()函数来利用PhpSpec的一些魔力:

function let(Rule $rule, ArrayTransformer $arrayTransformer, ChurchRepositoryInterface $church)
{
    $this->beConstructedWith($rule, $arrayTransformer, $church);
}

PhpSpec会自动从let()签名中的typehints中找出预期的模拟。