2014-02-13 2 views
0

생성자를 통해 Eloquent 모델을 주입 한 저장소를 테스트해야합니다.Laravel - Testing Repositories

class EloquentOrderRepository implements OrderRepositoryInterface 
{ 

    protected $model; 

    public function __construct(Order $model) 
    { 
     $this->model = $model; 
    } 

    public function calculateValues(array $deliveryOption = null) 
    { 
     if (! is_null($deliveryOption)) { 
      $this->model->value_delivery = (float) number_format($deliveryOption['price'], 2); 
     } 

     $this->model->value_products = (float) number_format($this->model->products->getTotal(), 2); 
     $this->model->value_total = (float) $this->model->value_products + $this->model->value_delivery; 
    } 
} 

$this->model->value_products (또는 속성 중 하나)을 호출 할 때 문제가 발생합니다. Eloquent 모델은 조롱 된 모델에없는 setAttribute 메서드를 호출하려고합니다. 이 메서드를 조롱하면 속성을 올바르게 설정할 수 없으며 테스트 어설 션이 실패합니다. 이에

<?php 
class EloquentOrderRepositoryTest extends \PHPUnit_Framework_TestCase 
{ 

    protected $model, $repository; 

    public function setUp() 
    { 
     $this->model = Mockery::mock('Order'); 
    } 

    public function test_calculate_values() 
    { 
     $repository = new EloquentOrderRepository($this->model); 

     $this->model->products = m::mock('SomeCollection'); 
     $this->model->products->shouldReceive('getTotal')->once()->withNoArgs()->andReturn(25); 

     $this->model->calculateValues(array('price' => 12)); 
     $this->assertEquals(12, $this->model->value_delivery); 
     $this->assertEquals(25, $this->model->value_products); 
     $this->assertEquals(37, $this->model->value_total); 
    } 
} 

어떤 생각 : 여기

내 시험입니까?

답변

4

당신의 주요 문제는 저장소 패턴을 올바르게 사용하지 않는다는 것입니다. 생성자에서 전달 된 모델을 프로토 타입으로 생각해야합니다. 함께 일하는 것이 진짜가 아니지만 다른 것들을 위해 사용하는 무언가의 예입니다. 저장소에서 getUnpaidOrders 메소드를 사용하면 return $this->model->wherePaid('0')->get();과 같은 작업을 수행 할 수 있습니다. 보시다시피, 우리는 실제 구체적인 인스턴스로 인스턴스와 상호 작용하지 않고 더 넓은 범위를 달성하기 위해 뭔가를 더 많이 사용합니다.

calculate 메서드에서이 프로토 타입 모델의 값을 실제로 설정하고 있습니다. 나는 당신이 이것들을 가지고 무엇을하려고하는지 알지 못하지만 이것이 저장소가 어떻게 해야하는지와 다르다는 것을 알고있다. 저장소에있는 메소드는 일반적으로 static (정적)과 같은 메소드로, 호출 (어쩌면 일부 입력)하고 다시 가져 오는 메소드입니다. 저장소에 내부 상태가 없어야하므로 모든 종류의 내부 상태에 영향을 미치지 않아야합니다.

바라건대 말이 되네.

+0

물론 합리적입니다. 답변 해주셔서 감사합니다. –