2014-01-10 3 views
3

나는 두 모델이 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 
    } 
} 

답변

7

를 원하는, 당신은 setAttributegetAttribute 메소드를 오버라이드 (override) 할 필요가 모델의 다음은 속성에 대한 기대를 설정할 수 있도록하는 솔루션입니다 당신을 위해 찾고 :

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