2014-09-30 48 views
1

我开始使用PHP单元,并且我正在尝试为需要作为类的__construct方法中的依赖项来测试类的雄辩模型构建模拟。PHP单元存储库测试案例的模拟雄辩模型

这是我的类的构造函数我想测试:

namespace App\Repository\Link; 

use App\Repository\RepositoryAbstract; 
use Illuminate\Database\Eloquent\Model; 

class EloquentLink extends RepositoryAbstract implements LinkInterface 
{ 
    protected $link; 

    public function __construct(Model $link) 
    { 
     $this->link = $link; 
    } 
} 

我的测试类是这样的:

namespace App\Repository\Link; 

use Link as ModelLink; //Link is the Eloquent model to pass as constructor for EloquentLink 
use Illuminate\Database\Eloquent\Model as Eloquent; //Link extends Eloquent 

class EloquentLinkTest extends \PHPUnit_Framework_TestCase 
{ 
    protected $modelMock; 
    protected $link; 

    public function setUp() { 
     $this->modelMock = $this->getMockBuilder('ModelLink')->getMock(); 
     $this->link = new EloquentLink($this->modelMock); 
    } 

    public function testCase() 
    { 
     //comes here 
    } 
} 

我得到这个错误:

1)应用程序\ Repository \ Link \ EloquentLinkTest :: testCase 传递给App \ Repository \ Link \ EloquentLink :: __ construct()的参数1必须是Illuminate \ Database \ Eloquent \ Model的实例,Mock_ModelLink的实例_ea1343ff给出

我该如何让模拟扩展Model类?

回答

1
use Link as ModelLink; 

此作用域ModelLink名称指向存在于包含文件(测试情况)的目的,全局命名空间的Link类。

$this->modelMock = $this->getMockBuilder('ModelLink')->getMock(); 

这将走出去,创造存在于全局命名空间的ModelLink类的模拟对象,在上下文中的另一个文件,包含该getMockBuilder方法的定义,即取其类文件。

这里的要点是,两种情况是完全不同的。有这句话,我们可以看一下说明书指导:

Note: Importing rules are per file basis, meaning included files will NOT inherit the parent file's importing rules.

试着改变你的电话本,看看它是否适合你:

$this->modelMock = $this->getMockBuilder('Link')->getMock(); 

,如果你要这将是不同的将在您的测试用例中创建的ModelLink对象的实例传递给getMockBuilder,但由于它将字符串作为参数,因此我们可以推断它必须负责仅从类名创建模拟对象。如果没有其他信息可用,则无法将其传递给别名类,并希望它能够正确定位有效的类。在这种情况下,它只是猜测并创建一个空的ModelLink对象的模拟(与您的原始Link对象的零关系)。

+0

谢谢你,我更换了一件与你的信息。在模型中,链接扩展Eloquent(这是一个用于Illuminate \ Database \ Eloquent \ Model的laravel别名)。所以我将其更改为:class Link扩展了Illuminate \ Database \ Eloquent \ Model – Barry127 2014-09-30 20:08:59

+0

没有什么错,但_that_'别名'提供的级别高于PHP语言,特别是Laravel应用程序。如果这也引发了一个问题,那么你可能会改变你的测试用例,从'app/tests/TestCase.php'扩展而不是直接从'PHPUnit_Framework_TestCase'扩展。该类将处理引导Laravel应用程序(包括'Eloquent'外观) – 2014-09-30 20:12:48