2012-04-16 6 views
3

Я смотрел на некоторых примерах в книге рецептов, но я не понимаю: http://book.cakephp.org/2.0/en/development/testing.html#a-more-complex-exampleТестирование переназначение CakePHP 2,0

Как я могу проверить перенаправление в действии Удалять, как этот?

public function delete($id = null){   
     $this->Comment->id = $id; 
     if (!$this->Comment->exists()) { 
      throw new NotFoundException(__('Invalid comment')); 
     } 
     if ($this->Comment->delete()) {   
      $this->Session->setFlash(__('Comment deleted')); 
      return $this->redirect(array('controller' => 'posts', 'action' => 'view', $idPost)); 
     } 
     $this->Session->setFlash(__('Comment was not deleted')); 
     return $this->redirect(array('controller' => 'posts', 'action' => 'view', $idPost));   
    } 
} 

Испытание прекращается после того, как перенаправление, так что даже не печатать это эхо:

public function testDelete(){  
    $result = $this->testAction("/comments/delete/1"); 
    echo "this is not printed"; 
    print_r($this->headers);   
} 
+0

Удивительно, если он бросает пустую ошибку. В этом случае вы можете попытаться насмехаться над функцией «render» на контроллере, так как в любом случае нет никакого вида удаления. – jeremyharris

+0

Что это значит, насмехаясь над этим? И да, нет, перенаправление прекрасно работает, и действие вида не пусто. – Alvaro

+0

Mocking - это процедура тестирования, при которой определенные методы возвращают то, что вы хотите. Например, 'CakeRequest :: send()' издевается и говорит ничего не делать, чтобы он не отправлял заголовки. Вы даже можете рассказать, какие методы или что ответить (см .: http://www.phpunit.de/manual/3.0/en/mock-objects.html). Для легкой насмешки с Cake, проверьте: http://book.cakephp.org/2.0/en/development/testing.html#using-mocks-with-testaction.'ControllerTestCase :: testAction()' делает некоторые из этого автоматически для вас. – jeremyharris

ответ

6

Тестирование вашего действия по удалению должно быть относительно таким же, как тестирование любых других действий. Ваш тестовый пример может выглядеть примерно так.

// notice it extends ControllerTestCase 
class PostsControllerTest extends ControllerTestCase { 

    function testDelete() { 
     $this->testAction('/posts/delete/1'); 
     $results = $this->headers['Location']; 
     // your OP code redirected them to a view, which I assume is wrong 
     // because the item would be deleted 
     $expected = '/posts/index'; 
     // check redirect 
     $this->assertEquals($results, $expected); 

     // check that it was deleted 
     $this->Posts->Post->id = 1; 
     $this->assertFalse($this->Posts->Post->exists()); 
    } 

} 

Конечно, это просто проверяет очевидное. Вы также можете проверить сеанс и написать тест, ожидающий исключения. Если он все еще не доходит до конца тестового примера или продолжается, что-то еще происходит.

Вы можете создавать простые mocks с помощью метода generate на ControllerTestCase.

function testDelete() { 
    $Posts = $this->generate('Posts', array(
    'components' => array(
     'Email' => array('send'), 
     'Session' 
    ) 
)); 
    // set ControllerTestCase to use this mock 
    $this->controller = $Posts; 

    $this->testAction('/posts/some_action_that_sends_email'); 
} 

Вышеприведенное сначала должно порождать насмешку PostsController для использования во время тестирования. Он также высмеивает метод send() на EmailComponent и весь SessionComponent.

Для получения дополнительной информации о насмехаясь: http://www.phpunit.de/manual/3.0/en/mock-objects.html

Для получения дополнительной информации о generate(): http://book.cakephp.org/2.0/en/development/testing.html#using-mocks-with-testaction

+0

После этого вызова: $ this-> testAction ('/ posts/delete/1'); ничего не выполняется. Поэтому я даже не могу сделать $ results = $ this-> headers ['Location']; Перенаправление останавливает его. – Alvaro

+0

Звучит, как будто что-то еще происходит. Попробуйте отправить полный тестовый пример, отбросьте некоторые операторы отладки в действии 'delete()', проверьте его с другим действием, которое использует перенаправление и т. Д. – jeremyharris

0

эха никогда не печатаются, ваша функция «удалить» всегда вызывает редирект, прежде чем заканчивается.

1

Возможно у вас есть ошибка, потому что $idPost не определено.

Я хотел бы написать что-то вроде этого:

public function delete($id = null){   
     $this->Comment->id = $id; 
     if (!$this->Comment->exists()) { 
      throw new NotFoundException(__('Invalid comment')); 
     } 
     if ($this->Comment->delete()) {   
      $this->Session->setFlash(__('Comment deleted')); 
     } else { 
      $this->Session->setFlash(__('Comment was not deleted')); 
     } 
     $this->redirect(array('controller' => 'posts', 'action' => 'view', $id));   
    } 
} 

И проверить это так:

public function testDeleteWithSuccess() { 
     $Controller = $this->generate('Comments', array(
      'components' => array(
       'Session' 
      ), 
      'models' => array(
       'Comment' => array('exists') 
      ) 
     )); 

     $Controller->Comment->expects($this->once()) 
      ->method('exists') 
      ->will($this->returnValue(true)); 

     $Controller->Session->expects($this->once()) 
      ->method('setFlash') 
      ->with('Comment deleted'); 

     $this->testAction("/comments/delete/ID"); 

     $this->assertEquals($this->headers['Location'], 'http://'. $_SERVER['HTTP_HOST'] . '/posts/view/ID'); 
    } 
0
public function delete($id = null){   
    $this->Comment->id = $id; 
    if (!$this->Comment->exists()) { 
     throw new NotFoundException(__('Invalid comment')); 
    } 
    if ($this->Comment->delete()) {   
     $this->Session->setFlash(__('Comment deleted')); 
    } else { 
     $this->Session->setFlash(__('Comment was not deleted')); 
    } 
    $this->redirect(array('controller' => 'posts', 'action' => 'view', $id));   
} 

}

Plenix, Разве это не совсем так? Вы удаляете комментарий и передаете идентификатор комментария контроллеру представления сообщений? Итак, вы просматриваете сообщение или комментарий, делая это? Любое другое предложение?

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