我使用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),否则我认为我不会看到这个错误.

推荐答案

问题是,当您创建模拟时:

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

Laravel相关问答推荐

CKEditor在laravel中的p标记之前和之后添加额外的p标记

我应该如何使用遵循依赖反转原则的工厂方法设计模式

如何在 Laravel 中使用多对一变形关系

将错误消息抛出并显示为关联数组

如何传递多个参数给路由

自从 Laravel 使用 Vite 更新后,我无法运行npm run dev

使用 laravel 根据当月显示注册用户列表

"public/index.php" 可以在 laravel 中按组写入

Lumen 中的自定义 404 页面

Laravel中具有两个外键字段的数据库一对多

Mockery 和 Laravel 构造函数注入

如何在 Laravel 5.5 的 FormRequest 类中返回自定义响应?

将 Laravel MYSQL 更改为 utf8mb4 以在现有数据库中支持表情符号

静态密码在默认的 Laravel 用户工厂中是如何工作的?

如何判断是否在laravel中设置了cookie?

如何更改 ember-cli 中的 dist 文件夹路径?

Laravel 5.2 身份验证不起作用

如何在 Laravel 或 Redis 中取消排队的作业(job)

如何在不要求用户登录 Laravel 的情况下验证Electron邮件

count() 参数必须是数组或在 laravel 中实现可数的对象