2013-12-20 2 views
5

4.비웃음 콜백 나는 현재 Laravel에서 패키지에 대한 테스트를 쓰고 있어요

내가하는 where 방법은 콜백을 사용하는 경우를 제외하고 거의 모든 시간을 작동 Illuminate\Database\Query\Builder을 조롱하고 난 못해 콜백 내의 메소드가 불려 갔는지 확인하십시오.

저는 여러분 중 한 명이 빛을 비추기를 희망했습니다.

$query = \Mockery::mock('Illuminate\Database\Query\Builder', function ($mock) { 
    /** @var \Mockery\Mock $mock */ 
    $mock->shouldReceive('where'); 
    $mock->shouldReceive('orWhere')->twice(); 
}); 

그리고 orWhere를 호출해야 실제 where 방법. 참고 : 빌더 모의가 아래 클래스로 전달됩니다.

$builder = new LaravelBuilder($query); 

그러면 아래 코드가 포함 된 $builder->filter()이 호출됩니다. 그것도 한 번 orWhere를 실행하지 않는

$this->query->where(function ($query) use ($filterData) { 
    /** @var \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder $query */ 
    foreach($filterData['columns'] as $colData) { 
     /** @var \Samvaughton\Ldt\Column $column */ 
     $column = $colData['column']; 

     // See if this column is searchable 
     if (!$column->isSearchable() || !$colData['searchable']) continue; 

     // If the individual column term is empty, use the main term 
     $term = (empty($colData['term'])) ? $filterData['term'] : $colData['term']; 

     // Actually apply the filter 
     $query->orWhere($column->getSqlColumn(), "LIKE", "%{$term}%"); 
    } 
}); 

주요 부분은 하단 비트 $query->orWhere되면, phpunit을 테스트 할 때마다 실패합니다. continue으로 인해 실행에 도달하지 못할 수도 있다고 말하기 전에 내가 통과 한 데이터가이를 허용합니다.

나는 이것이 처음에 where 방법을 조롱하는 방법 때문이라고 생각합니다. foreach 앞에 exit을 포함하면 콜백 내부에서 아무 것도 실행하지 않는다는 것을 나타내는 실행되지 않습니다. 그게 기본 동작인지는 모르겠지만 같은/비슷한 콜백을 실행하려면 Mockery를 얻는 방법은 무엇입니까?

shouldExpect을 사용하여 부분 목을 사용해 보았지만 완전히 이해하지 못했습니다. 나는 또한 주위를 검색해 보았지만이 시나리오에서는 운이 없다.

콜백 내에서 조롱을 사용하는 방법을 배울 수 있다면 좋을 것입니다.

답변

3

그래,이게 더 나은 방법이라고 생각해.하지만 나는 부분적으로 Laravel의 쿼리 빌더를 조롱하는 것에 의존했다. Illuminate\Database\Query\Builder

에서

참조 라인 (324) 폐쇄 Laravel을 사용하여도 조롱 할 필요가 새 쿼리 빌더를 생성합니다. 그래서 쿼리 빌더 (단위 테스트에 충실하지 않은) 지금이 가장 좋은 해결책이 아니다 폐쇄에 대한 원래의 기능을 유지

$query = \Mockery::mock('Illuminate\Database\Query\Builder', function ($mock) { 
    /** @var \Mockery\Mock $mock */ 
    $mock->makePartial(); 
    $mock->shouldReceive('where')->once()->passthru(); 
    $mock->shouldReceive('newQuery')->andReturn(
     \Mockery::mock('Illuminate\Database\Query\Builder', function ($mock) { 
      /** @var \Mockery\Mock $mock */ 
      $mock->makePartial(); 
      $mock->shouldReceive('orWhere')->twice(); 
     }) 
    ); 
}); 

내가 makePartial()를 사용하는 데 필요한 : 여기 근무 코드입니다. 여기에서 나는 비슷한 형식으로 조롱하는 새로운 쿼리 빌더 인스턴스를 생성하기 위해 호출되는 newQuery 메서드를 조롱한다.

+0

정말 도움이되었습니다. 모의 문서에서 클로저를'mock'의 두 번째 인수로 전달하는 것에 대해서는 아무것도 찾을 수 없습니다. 이 일을 어떻게 알았습니까? – alexw