gpt4 book ai didi

php - Mockery 和 Laravel 构造函数注入(inject)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:53:44 25 4
gpt4 key购买 nike

我正在使用带有 php 单元的 laravel 5 来创建一个 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);
}
}

..它实现了一个模型

namespace Myname\Myapp\Models;

use Illuminate\Database\Eloquent\Model;

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

Laravels IoC 自动将 PersonModel 注入(inject)到 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\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

根据我的阅读, mock 扩展了它正在模拟的类,因此注入(inject)扩展类来代替类型提示的父类 (PersonModel) 应该没有问题

显然我遗漏了一些东西。其他示例显式地将模拟对象注入(inject)到它们随后正在测试的类中。 Laravels IoC 正在(应该)为我做这件事。我必须绑定(bind)任何东西吗?

我有一种感觉,虽然 mock 对象没有按照我想的方式创建(扩展 PersonModel),否则我假设我不会看到这个错误。

最佳答案

问题是当你创建你的模拟时:

$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

所以尝试做这样的事情:

$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');

关于php - Mockery 和 Laravel 构造函数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36723522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com