测试 Facade 时无法重新声明 ::shouldReceive()

Web*_*net 11 php unit-testing facade laravel

根据Laravel 文档,我应该能够通过 模拟外观Object::shouldReceive(),但是当我这样做时,它说我无法重新声明该方法。当我在浏览器中查看该视图时,该视图可以正常工作,我只需要弄清楚如何正确测试它。

Cannot redeclare Mockery_1_Facades_MyService::shouldReceive() in /path-to-project/vendor/mockery/mockery/library/Mockery/Loader/EvalLoader.php(16) : eval()'d code on line 672

这是我的测试:

public function testSend()
{
    MessageService::shouldReceive('find')->once()->with(1);

    $this->call('GET', '/message/1/send');

    $this->assertRedirectedToRoute('message.index');
}
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

public function send($id)
{
    $message = MessageService::find($id);
    $this->messageService->sendBroadcast($message);

    return Redirect::route('message.index')
        ->with('message', "Sending message: {$message->name}, stand by...");
}
Run Code Online (Sandbox Code Playgroud)

car*_*sel 5

您正在尝试模拟已经模拟的类。查看您是否已将服务注册为外观 - Laravel 有很多自动生成的默认值,这是很难注意到的。这是一个外观的shouldReceive方法:

public static function shouldReceive()
    {
    $name = static::getFacadeAccessor();

    if (static::isMock())
    {
        $mock = static::$resolvedInstance[$name];
    }
    else
    {
        $mock = static::createFreshMockInstance($name);
    }

    return call_user_func_array(array($mock, 'shouldReceive'), func_get_args());
    }
Run Code Online (Sandbox Code Playgroud)