2014-01-10 4 views
3

say У меня две модели, которые простираются от Eloquent, и они связаны друг с другом. Могу ли я высмеять отношения?laravel 4 mockery mock model relationship

т.е.

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

ответ

7

Поскольку трасса является собственностью и не метод, при создании издеваться вам нужно будет переопределить setAttribute и getAttribute метод 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); 

Вам не нужно указать метод track когда насмешливый Course объект, если вы также желая тестовый код, основанный на построителе запросов. Если это так, то вы можете высмеять метод 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); 
Смежные вопросы