Mockery和Laravel构造函数注入 [英] Mockery and Laravel constructor injection

查看:147
本文介绍了Mockery和Laravel构造函数注入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将laravel 5与php单元一起使用来创建laravel软件包.我有一个Repository ..

I am using laravel 5 with php unit to create a laravel package. I have a Repository..

namespace Myname\Myapp\Repositories;

use Myname\Myapp\Models\PersonModel;

class PersonRepository
{
    protected $personModel;

    public function __construct(PersonModel $personModel)
    {
        $this->personModel = $personModel;
    }

    public function testFunction($var)
    {
        return $this->personModel->find($var);
    }
}

..实现了Model.

namespace Myname\Myapp\Models;

use Illuminate\Database\Eloquent\Model;

class PersonModel extends Model
{
    protected $table = 'person';
}

Laravels IoC自动将PersonModel注入到PersonRepository的构造函数中.

Laravels IoC automatically injects PersonModel into the constructor of PersonRepository.

我正在编写一个单元测试,我想使用嘲笑来模拟PersonModel模型,因此在测试过程中我不会访问数据库.

I am writing a unit test where I want to mock the PersonModel model using mockery so I am not hitting the database during testing.

namespace Myname\Myapptests\unit;

use Mockery;

class PersonRepositoryTest extends \Myname\Myapptests\TestCase
{
     /**
     * @test
     */ 
     public function it_returns_the_test_find()
     {
         $mock = Mockery::mock('Myname\Myapp\Models\PersonModel')
            ->shouldReceive('find')
            ->with('var');

         $this->app->instance('Myname\Myapp\Models\PersonModel', $mock);
         $repo = $this->app->make('Myname\Myapp\Repositories\PersonRepository');
         $result = $repo->testFunction('var');

         $this->assert...
     }
}

运行测试时出现错误

1)Myname \ Myapptests \ unit \ PersonRepositoryTest :: it_returns_the_test_find ErrorException:传递给Myname \ Myapp \ Repositories \ PersonRepository :: __ construct()的参数1必须是Myname \ Myapp \ Models \ PersonModel的实例,给出的Mockery \ CompositeExpectation的实例

1) Myname\Myapptests\unit\PersonRepositoryTest::it_returns_the_test_find ErrorException: Argument 1 passed to Myname\Myapp\Repositories\PersonRepository::__construct() must be an instance of Myname\Myapp\Models\PersonModel, instance of Mockery\CompositeExpectation given

根据我所读的内容,嘲笑扩展了它正在嘲笑的类,因此将扩展类替换为提示类型的父类(PersonModel)应该没有问题

From what I have read, mockery extends the class it is mocking so there should be no issue injecting the extended class in place of the type hinted parent (PersonModel)

很明显,我缺少了一些东西.其他示例将模拟对象显式注入到要测试的类中. Laravels IoC正在(应该)为我这样做.我必须绑定任何东西吗?

Obviously I am missing something. Other examples explicitly inject the mocked object into the class they are then testing. Laravels IoC is (should be) doing this for me. Do I have to bind anything?

我有一种感觉,尽管嘲笑对象不是按照我的想法创建的(扩展PersonModel),否则我认为我不会看到此错误.

I have a feeling though that the mockery object isn't being created in the way I think (extending PersonModel) otherwise I assume I wouldn't see this error.

推荐答案

问题是您创建模拟游戏时出现的问题:

Problem is when you create your mock:

$mock = Mockery::mock('Myname\Myapp\Models\PersonModel')
    ->shouldReceive('find')
    ->with('var');

所以这个:

$mock = Mockery::mock('Myname\Myapp\Models\PersonModel')
var_dump($mock);
die();

将输出如下内容:Mockery_0_Myname_Myapp_Models_PersonModel

但是这个:

$mock = Mockery::mock('Myname\Myapp\Models\PersonModel')
    ->shouldReceive('find')
    ->with('var');
var_dump($mock);
die();

将输出以下内容:Mockery\CompositeExpectation

所以尝试做这样的事情:

So try doing something like this:

$mock = Mockery::mock('Myname\Myapp\Models\PersonModel');
$mock->shouldReceive('find')->with('var');

$this->app->instance('Myname\Myapp\Models\PersonModel', $mock);
$repo = $this->app->make('Myname\Myapp\Repositories\PersonRepository');
$result = $repo->testFunction('var');

这篇关于Mockery和Laravel构造函数注入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆