我只是尝试这样做:我有一个A类,它使用B类的服务。为了隔离这个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');
}但在运行测试测试后,我总是得到这样的消息:传递给BSrequest::__construct()的参数1必须是驱动程序的实例,给定的Mockery__Library_Driver实例,在/var/www/laravel/app/ErrorException/ExampleTest.php的第56行调用并定义
我的BSrequest是这样的:
class BSrequest {
private $driver;
public function __construct(Driver $driver) {
$this->driver = $driver;
}
function get() {
return $this->driver->get();
}}你能告诉我如何做到这一点吗?谢谢
发布于 2015-04-16 02:34:01
我认为你遇到了命名空间的问题,或者你遇到了自动加载的问题。
在您的测试文件中,确保驱动程序类已自动加载。你可以这样做:
public function testDriverClassIsAvailable()
{
$driver = new Driver();
$this->assertEquals(get_class($driver), 'Driver');
}如果这样可以工作,那么您将知道您的Driver类是自动加载的并且可用,并且BSRequest类存在问题,因为它没有可用的Driver类。如果您使用的是名称空间,请确保没有输入错误。
模拟的Driver实例应该满足BSRequest->__construct()所需的类型提示,因此一定要包含类型提示。
发布于 2014-10-30 15:33:23
事实上,在写东西的时候,每件事都很好用。
public function __construct($driver) {
$this->driver = $driver;
}这意味着移除$driver上的类型控件。但我确信我们可以在保持Driver $driver的基础上实现所有这些功能
不幸的是我不知道该怎么做
https://stackoverflow.com/questions/26624012
复制相似问题