2013-12-04 2 views
1

Я пытаюсь проверить мой контроллер с этим тестом (я использую Laravel, если это имеет значение):Насмешка не вызывается методом из репозитория (интерфейс)

<?php 
use Zizaco\FactoryMuff\Facade\FactoryMuff; 

class ProjectControllerTest extends TestCase 
{ 
    public function setUp() 
    { 
     parent::setUp(); 

     $this->mock = $this->mock('Dumminvoicing\Storage\Project\ProjectRepositoryInterface'); 
    } 

    public function mock($class) 
    { 
     $mock = Mockery::mock($class); 

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

     return $mock; 
    } 

    protected function tearDown() 
    { 
     Mockery::close(); 
    } 

    public function testRedirectWhenNotLogged() 
    { 
     Route::enableFilters(); 
     $response = $this->call('GET', 'projects'); 
     $this->assertRedirectedToAction('[email protected]'); 
    } 

    public function testAllowedWhenLogged() 
    { 
     Route::enableFilters(); 
     //Create user and log in 
     $user = FactoryMuff::create('User'); 
     $this->be($user); 
     $response = $this->call('GET', 'projects'); 
     $this->assertResponseOk(); 
    } 

    public function testIndex() 
    { 
     $this->mock->shouldReceive('all')->once(); 
     $this->call('GET', 'projects'); 
     $this->assertViewHas('projects'); 
    } 

} 

После этих обучающих http://culttt.com/2013/07/08/creating-flexible-controllers-in-laravel-4-using-repositories/http://culttt.com/2013/07/15/how-to-structure-testable-controllers-in-laravel-4/ я использую репозитории избегайте связывания моей БД с тестами. Таким образом, у меня есть эти 2 дополнительных классов:

<?php 
namespace Dumminvoicing\Storage\Project; 

use Project; 
class EloquentProjectRepository implements ProjectRepository 
{ 
    public function all() 
    { 
     return Project::all(); 
    } 

    public function find($id) 
    { 
     return Project::find($id); 
    } 
} 

<?php 
namespace Dumminvoicing\Storage\Project; 

interface ProjectRepository 
{ 
    public function all(); 
    public function find($id); 
} 

Когда я запускаю тест, я получаю эту ошибку:

Был 1 ошибка:

1) ProjectControllerTest :: testIndex Издевательство \ Exception \ InvalidCountException: метод all() из Mockery_2143809533_Dumminvoicing_Storage_Project_ProjectRepositoryInterface следует называть ровно 1 раз, но называть 0 раз.

Индексный метод контроллера отлично работает в браузере:

 use Dumminvoicing\Storage\Project\ProjectRepository as Project; 

    class ProjectsController extends \BaseController 
    { 
     protected $project; 

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

      $this->beforeFilter('auth'); 
     } 
    } 
/** 
    * Display a listing of the resource. 
    * 
    * @return Response 
    */ 
    public function index() 
    { 
     $data['projects'] = $this->project->all(); 
     return View::make('projects.index', $data) ; 
    } 

Так почему же неудачу в тесте? Почему «все» не называются?

ответ

1

Если пользователь должен пройти аутентификацию, чтобы воспользоваться методом index, вам необходимо пройти аутентификацию каждого теста.

all не вызывается, потому что пользователь перенаправляется.

Создайте метод authentication, который вы можете вызывать каждый раз, когда вам нужно выполнить аутентификацию запроса.

Чтобы узнать, почему тест не срабатывает, выведите ответ, прежде чем выполнять утверждение.

Редактировать

Проблема в том, как вы издевались Dumminvoicing\Storage\Project\ProjectRepositoryInterface, но это должно быть Dumminvoicing\Storage\Project\ProjectRepository.

Если вы исправите пространство имен и добавьте $this->mock->shouldReceive('all')->once(); в метод testAllowedWhenLogged(), ваши тесты пройдут правильно.

+0

Вау! Ответ от самого Филиппа Брауна! Ваши учебники потрясающие! Что касается этого ... не были ли фильтры, которые не могли работать? Вот почему я поместил Route :: enableFilters(); в двух других тестах ... эта линия влияет на все тесты? – Cmorales

+0

Я не думаю, что происходит перенаправление, я изменил это утверждение на $ this-> assertRedirectedToAction ('UserController @ getLogin'); и он терпит неудачу с «Неверным утверждением, что Illuminate \ Http \ Response Object (...) является экземпляром класса« Illuminate \ Http \ RedirectResponse ».» – Cmorales

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