laravel 4嘲笑模拟模型关系

问题描述:

说我有两个模型,从Eloquent延伸,它们相互关联。我可以嘲笑关系吗?laravel 4嘲笑模拟模型关系

即:

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

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

在MyTest的,我想通过调用跟踪属性,而不是赛道实例(我不创造过程的模拟,并返回轨道,的一个实例要查询生成器

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 
    } 
} 

由于赛道是一个属性,而不是一个方法,创造了模拟时,你会需要重写setAttributegetAttribute方法s的模型。下面是一个解决方案,可以让你设置该属性的期望,你正在寻找:

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