2013-11-07 2 views
0

Учитывая красноречивое репо, которое выглядит примерно так.Тестирование Eloquent Сохранение метода из репозитория

class PinRepo { 
     protected $pinModel; 

     public function __construct(Model $pinModel) 
     { 
      $this->pinModel = $pinModel; 
     } 
     public function addPinToProject($page_id, $inputs) 
     { 
      $pin = new $this->pinModel(); 
      $pin->fill($inputs); 
      $pin->save(); 
      return $pin; 
     } 
    } 

Моя первая попытка была:

class PinRepoTest extends TestCase { 

    public function setUp() 
    { 
     parent::setUp(); 
     $this->modelMock = Mockery::mock('Pin'); 
     $this->pinRepo = PinRepo($this->modelMock); 
    } 

    public function testAddPinToPage() 
    {  
     $this->modelMock 
      ->shouldReceive('fill')->with(["project_page_id"=>1]) 
      ->once() 
      ->andReturn(Mockery::self()) 
      ->shouldReceive('save') 
      ->once(); 
     $this->pinRepo->addPinToProject(2, ["project_page_id"=>1]); 
    } 
} 

Но я получаю эту ошибку (Какой вид имеет смысл)

«Метод :: заливка() не существует на этом издеваться объект "

Учитывая эту настройку, есть ли способ получить этот тест для проходить ?

ответ

0

Вот что я придумал:

class modelStub extends Illuminate\Database\Eloquent\Model { 

    static $methodCalls = []; 

    public function fill(array $attributes) 
    { 
     self::$methodCalls['fill'] = TRUE; 
     return $this; 
    } 
    public function save(array $options = array()) 
    { 
     self::$methodCalls['save'] = TRUE; 
     //dd($this); 
     return $this; 
    } 

    public function __set($name, $value) 
    { 
     //dd($name, $value); 
     static::$$name = $value; 
     return $this; 
    } 
} 


class pageModelStub extends modelStub { 
    static $project_guid = false; 
} 

    public function testAddPageToProject() 
    { 
     $modelStub = new pageModelStub; 
     $this->pageRepo = new \Nota\Repos\PageRepo($modelStub); 
     $this->pageRepo->addPageToProject('project_guid', ['fds']); 
     $this->assertTrue($modelStub::$methodCalls['fill']); 
     $this->assertTrue($modelStub::$methodCalls['save']); 
     $this->assertEquals($modelStub::$project_guid, "project_guid"); 
    } 

кажется Hacky, но по крайней мере, я могу проверить, что важно для меня на этом методе. Любые улучшения в этом приветствуются.

Смежные вопросы