Я пытаюсь проверить свой контроллер с помощью этого теста (я использую 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('UserController@getLogin'); } 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 -структура-testable-controller-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 Mockery \ 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) ; }
Так почему же он не прошел тест? Почему «все» не называются?