unit-testing - laravel 4 mock 模拟模型关系

标签 unit-testing laravel mocking laravel-4 mockery

假设我有两个从 Eloquent 扩展而来的模型,它们相互关联。我可以 mock 这段关系吗?

即:

class Track extends Eloquent {
    public function courses()
    {
        return $this->hasMany('Course');
    }
}

class Course extends Eloquent {
    public function track()
    {
        return $this->belongsTo('Track');
    }
}

在 MyTest 中,我当然想创建一个模拟,并返回一个轨道实例,通过调用轨道属性,而不是轨道实例(我不想要查询 build 者)

use \Mockery as m;

class MyTest extends TestCase {
    public function setUp()
    {
        $track = new Track(array('title' => 'foo'));
        $course = m::mock('Course[track]', array('track' => $track));

        $track = $course->track  // <-- This should return my track object
    }
}

最佳答案

由于 track 是属性而不是方法,因此在创建模拟时,您需要重写模型的 setAttributegetAttribute 方法。下面是一个解决方案,可让您为要查找的属性设置期望值:

$track = new Track(array('title' => 'foo'));
$course = m::mock('Course[setAttribute,getAttribute]');
// You don't really care what's returned from setAttribute
$course->shouldReceive('setAttribute');
// But tell getAttribute to return $track whenever 'track' is passed in
$course->shouldReceive('getAttribute')->with('track')->andReturn($track);

在模拟 Course 对象时,您不需要指定 track 方法,除非您还想测试依赖于查询构建器的代码。如果是这种情况,那么您可以像这样模拟 track 方法:

// This is just a bare mock object that will return your track back
// whenever you ask for anything. Replace 'get' with whatever method 
// your code uses to access the relationship (e.g. 'first')
$relationship = m::mock();
$relationship->shouldReceive('get')->andReturn([ $track ]);

$course = m::mock('Course[track]');
$course->shouldReceive('track')->andReturn($relationship);

关于unit-testing - laravel 4 mock 模拟模型关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21050435/

相关文章:

python 在一个测试函数中测试代码覆盖率和多个断言

java - 我可以使用注释将原始变量注入(inject)模拟类吗?

mysql - Laravel 数组到多条记录的字符串转换

php - 无法从多个 html 复选框访问值

java - 使用 powermockito 模拟 URL 类时出现问题

java - 如何在java中对同步方法进行单元测试?

unit-testing - Web 应用程序的 Visual Studio 2012 编码 UI 测试 - 代码覆盖率

php - 如何将条件附加到 Eloquent 关系查询中?

c# - 模拟 Moq C# 中运算符的行为

javascript - Angular 测试文档中 "errorMessage()"功能的内容。 (见说明)