我使用laravel 5和php单元来创建一个laravel包.我有一个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
的构造函数中.
我正在编写一个单元测试,我想用mocky模拟PersonModel
模型,这样在测试过程中就不会碰到数据库.
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::返回测试结果
从我所读到的内容来看,mockry扩展了它所模拟的类,因此注入扩展类来代替类型暗示的父类(PersonModel)应该没有问题
显然我错过了什么.其他示例显式地将模拟对象注入到他们正在测试的类中.拉雷夫斯国际奥委会正在(应该)为我做这件事.我需要绑什么东西吗?
但我有一种感觉,mockry对象并不是以我认为的方式创建的(扩展PersonModel),否则我认为我不会看到这个错误.