使用Laravel和Mockery

时间:2014-10-29 06:31:11

标签: laravel mockery

我只想尝试进入: 我有一个使用B类服务的A类。 为了隔离这个类A并测试它,我想使用Mockery和stub类B.

这样做我做了

public function testMock()
{

    $driver = Mockery::mock('Driver');
    App::instance('Driver',$driver);
    $driver->shouldReceive('get')->once()->andReturn('Did the job');

    $request = new BSRequest($driver);

    $this->assertEquals($request->get(),'Did the job');

}

但是在运行测试后我总是得到这条消息 ErrorException:传递给BSrequest :: __ construct()的参数1必须是Driver的实例,给出Mockery_0_Library_Driver的实例,在第56行的/var/www/laravel/app/tests/ExampleTest.php中调用并定义

我的BSrequest就是这样:

    class BSrequest {

private $driver;

public function __construct(Driver $driver) {
    $this->driver = $driver;
}

function get() {
    return $this->driver->get();
}}

你能告诉我怎么做到这一点吗? 感谢

2 个答案:

答案 0 :(得分:1)

我相信你遇到了一个命名空间问题,或者你遇到了自动加载问题。

在测试文件中,确保已自动加载Driver类。你可以这样做:

public function testDriverClassIsAvailable()
{

    $driver = new Driver();

    $this->assertEquals(get_class($driver), 'Driver');
}

如果这样可行,那么您将知道您的Driver类已自动加载且可用且BSRequest类存在问题,因为它没有Driver类可用。如果您正在使用名称空间,请确保没有拼写错误。

模拟Driver实例应满足BSRequest->__construct()所需的类型提示,因此您应该明确包含typehint。

答案 1 :(得分:0)

事实上,在编写

时,每件事情都很有效
public function __construct($driver) {
    $this->driver = $driver;
}

这意味着删除$ driver上的Type控件。 但我确信我们可以实现保持Driver $ driver

的所有这些功能

不幸的是,我无法知道如何