2013-12-09 1 views
0

Я пытаюсь проверить эту функцию в контроллере Laravel:Как проверить, с помощью Mockery, контроллера, который использует Ardent Model?

/** 
    * Store a newly created resource in storage. 
    * 
    * @return Response 
    */ 
    public function store() 
    { 
     $project = $this->project->create(Input::all()); 
     if ($errors = $project->errors()->all()) { 
      return Redirect::route('projects.create') 
      ->withInput() 
      ->withErrors($errors); 

     } 
     return Redirect::route('projects.index') 
     ->with('flash', Lang::get('projects.project_created')); 

    } 

My (неправильно) тест выглядит следующим образом:

public function testStoreFails() 
    { 
     $this->mock->shouldReceive('create') 
      ->once() 
      ->andReturn(Mockery::mock(array(
        false, 
        'errors' => array() 
        ))); 
     $this->call('POST', 'projects'); 
     $this->assertRedirectedToRoute('projects.create'); 
     $this->assertSessionHasErrors(); 
    } 

Проблема заключается, в основном, что Пламенная устанавливает $ проект ложным когда проверка не выполняется, но также устанавливает ошибки на том же самом объекте, который может быть удален с помощью -> errors() -> all().

Я совсем потерялся, пытаясь выяснить, что вернуть в макете.

Примечание: Конструктор впрыскивает модель:

public function __construct(Project $project) 
    { 
     $this->project = $project; 

     $this->beforeFilter('auth'); 
    } 

ответ

1

- ред следующие комментарии в ответ -

Если я понять, что вы пытаетесь сделать правильно, вы могли бы это сделать :

  • Mock метод create() вернуть высмеивал Project.
  • Mock save() метод для возврата false.
  • Mock a MessageBag экземпляр, являющийся объектом, который возвращает errors(). Этот макет должен содержать насмешливый метод all().
  • Сделайте издевательство errors(), чтобы вернуть MessageBag макет.

Предполагая $this->mock является макет из Project класса здесь:

// given that $this->mock = Mockery::mock('Project') 

public function testStoreFails() 
{ 
    // Mock the create() method to return itself 
    $this->mock->shouldReceive('save')->once()->andReturn(false); 

    // Mock MessageBag and all() method 
    $errors = Mockery::mock('Illuminate\Support\MessageBag'); 
    $errors->shouldReceive('all')->once()->andReturn(array('foo' => 'bar')); 

    // Mock errors() method from model and make it return the MessageBag mock 
    $this->mock->shouldReceive('errors')->andReturn($errors); 

    // Proceed to make the post call 
    $this->call('POST', 'projects'); 
    $this->assertRedirectedToRoute('projects.create'); 
    $this->assertSessionHasErrors(); 
} 
+0

PHP Фатальная ошибка: Вызов функции-члена ошибки() на не-объект в/dumminvoicing/приложение/контроллеры/ProjectsController. php on line 43 – Cmorales

+0

Я предполагаю, что метод create не может вернуть только false, потому что в этом случае метод ошибок не может быть вызван. – Cmorales

+0

Хорошо, это имеет смысл. Я прочитал в вашем вопросе, что он был возвращен ложным, и я запутался. Попробуйте отредактировать ответ, я переместил 'create()' mock в начало функции и изменил возвращаемое значение. Я также удалил 'once()' при издевательском 'errors()', так как я думаю, что метод 'withErrors()' может снова называть это ... на всякий случай. –

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