模拟 class 不接受 Carbon 实例

Mocked class not accepting instance of Carbon

我正在尝试使用 PhpUnit 和 Mockery 测试一个方法。在指定应使用参数调用方法的过程中,我的测试失败了。

测试:

 $this->eventRepo = \Mockery::mock('Path\To\EventRepository');

 $start = Carbon::createFromFormat('Ymd-H-i-s', '20141211-09-21-00');
 $end = Carbon::createFromFormat('Ymd-H-i-s', '20141211-09-19-00');

 $this->eventRepo
        ->shouldReceive('findEvent')
        ->withArgs([
            $start,
            $end,
            '1',
            '1234567891'
        ])
        ->andReturn($callEvent);

真实代码:

    $start = Carbon::createFromFormat('Ymd-H-i-s', '20141211-09-20-00');
    $end = Carbon::createFromFormat('Ymd-H-i-s', '20141211-09-20-00');

    $event = $this->eventRepo->findEvent(
        $start->subSeconds(60),
        $end->addSeconds(60),
        $id,
        $number
    );

测试错误:

 Mockery\Exception\NoMatchingExpectationException: No matching handler found for EventRepo::findEvent(object(Carbon\Carbon), object(Carbon\Carbon), "1", "1234567891"). Either the method was unexpected or its arguments matched no expected argument list for this method

$this->eventRepo 是测试中的模拟。真正的代码运行正确。错误显示后,我猜 var_dump() 是 Carbon 的一个实例。

我不知道是什么原因造成的。我试着用谷歌搜索它,但不知道 google 是什么让它变得一文不值。有人遇到过这个吗?

当使用 with()withArgs() 中的对象时,phpunit 执行 === 检查。这意味着它将寻找完全相同的 class 实例,而不仅仅是 Carbon 的任何实例。

在这种情况下,这意味着 findEvent() 正在接收 Carbon 的实例,但与实际代码中的实例不完全相同。