我只想尝试进入: 我有一个使用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();
}}
你能告诉我怎么做到这一点吗? 感谢
答案 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
的所有这些功能不幸的是,我无法知道如何