Я использую laravel 5 с модулем php для создания пакета laravel. У меня есть Repository
..Mockery and Laravel constructor injection
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);
}
}
..which реализует Model
.
namespace Myname\Myapp\Models;
use Illuminate\Database\Eloquent\Model;
class PersonModel extends Model
{
protected $table = 'person';
}
Laravels IoC автоматически впрыскивает PersonModel
в конструктор PersonRepository
.
Я пишу единичный тест, где хочу издеваться над моделью 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 \ блок \ PersonRepositoryTest :: it_returns_the_test_find ErrorException: Аргумент 1 передается Myname \ MyApp \ Хранилища \ PersonRepository :: __construct() должен быть экземпляром Myname \ Myapp \ Models \ PersonModel, например, насмешки \ CompositeExpectation данного
из того, что я прочитал, издевательство расширяет класс он издевается, так что не должно быть никакой проблемы вводя расширенный класс вместо типа намеченного родителя (PersonModel)
Очевидно, что я чего-то не хватает. В других примерах явным образом вводят издеваемый объект в класс, который они тестируют. Laravels IoC (должно быть) делает это для меня. Нужно ли мне что-то связывать?
У меня есть ощущение, что объект издевательств создается не так, как я думаю (расширение PersonModel), иначе я предполагаю, что не увижу эту ошибку.
Не могли бы вы попытаться импортировать свою модель? вы используете 'PersonModel :: class', но я не вижу' use 'Myname \ Myapp \ Models \ PersonModel'' –
@FabioAntunes Обновлен код и вывод ошибки – myol