2015-01-14 4 views
3

Я тестирую один из моих контроллеров, и независимо от того, что я пытаюсь, я получаю ошибку, что функция all() не существует.Laravel 5 mock a Eloquent model

Static method Mockery_1_App_Models_User::all() does not exist on this mock object 

Мой метод испытания:

/** 
* Test index page 
* @return void 
*/ 
public function testIndexAsUser() 
{ 
    $this->beUser(); 

    // The method calls the mock objects should receive 
    $this->user->shouldReceive('all')->once()->andReturn([]); 

    // Call index page 
    $response = $this->call('GET', 'users'); 

    // Assertions 
    $this->assertResponseOk(); 
    $this->assertViewHas('user'); 
    $this->assertViewNameIs('users.show'); 
} 

Мой метод насмешливое:

/** 
* Mock a class 
* @param string $class 
* @return Mockery 
*/ 
public function mock($class) 
{ 
    $mock = Mockery::mock('Eloquent', $class); 

    app()->instance($class, $mock); 

    return $mock; 
} 

Мой фактический метод управления:

/** 
* Show all users 
* @return Response 
*/ 
public function getIndex() 
{ 
    $users = $this->user->all(); 

    return view('users.index'); 
} 

Могу ли я использовать неправильный Красноречивый класс в моем макет или что-то еще? Начиная с Laravel 5, модели не относятся к Eloquent, а к Illuminate\Database\Eloquent\Model, но я тоже это пробовал.

+1

Существует хороший шанс, что это связано с тем, что Laravel 5 еще не находится в Бета-версии, а «тестовые» функции Laravel 5 еще не закончены. Я бы потратил слишком много времени на это, пока Taylor не закончит всю поддержку тестирования для L5. – Laurence

+0

Вы пытались «Mockery :: mock» («Модель», $ class) 'или' Mockery :: mock ('App \ Model', $ класс) '? (Я знаю, вы сказали, что попробовали с полным пространством имен, но вы пробовали короткие версии?) – Laurence

ответ

1

Самый простой способ издеваться красноречивым модель является использование партиалы:

$mock = m::mock('MyModelClass')->makePartial(); 

Однако, это не поможет вам много, как вы используете статический метод (all()). Не столь строгий характер PHP позволяет вызывать статические методы нестатически ($user->all()), но вы должны его избегать. Вместо этого вы должны сделать это властный путь:

$users = $this->user->newQuery()->get(); 

Это может быть высмеивал:

$mockUser->shouldReceive('newQuery->get')->andReturn([/*...*/]); 

Если вы хотите сделать еще один шаг вперед, переместите get() вызов в отдельный класс репозитория, который впрыскивается в контроллер, что облегчает насмешку. Вы можете найти множество статей в шаблоне репозитория в Интернете.

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