Mockery和Laravel构造函数注入 [英] Mockery and Laravel constructor injection
问题描述
我正在将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屋!