用于存储库TestCase的PHP Unit Mock Eloquent Model

时间:2014-09-30 19:46:19

标签: php laravel laravel-4 phpunit eloquent

我从PHP单元开始,我试图为一个Eloquent模型构建一个Mock,这个模型需要作为__construct方法中的依赖项进行测试。

这是我要测试的班级的构造函数:

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)App \ Repository \ Link \ EloquentLinkTest :: testCase 传递给App \ Repository \ Link \ EloquentLink :: __ construct()的参数1必须是Illuminate \ Database \ Eloquent \ Model的实例,Mock_ModelLink_ea1343ff的实例给出

如何让mock扩展Model类?

1 个答案:

答案 0 :(得分:1)

use Link as ModelLink;

这使ModelLink名称的范围指向全局命名空间中存在的Link类,用于包含文件(您的测试用例)。

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

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

这里的要点是两种情境完全不同。我们可以在手册中查看这个引用,以获得指导:

  

注意:   导入规则是基于每个文件的,这意味着包含的文件不会继承父文件的导入规则。

尝试将您的通话更改为此,看看它是否适合您:

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

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