Я пытаюсь проверить мой контроллер с этим тестом (я использую 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) ;
}
Так почему же неудачу в тесте? Почему «все» не называются?
Вау! Ответ от самого Филиппа Брауна! Ваши учебники потрясающие! Что касается этого ... не были ли фильтры, которые не могли работать? Вот почему я поместил Route :: enableFilters(); в двух других тестах ... эта линия влияет на все тесты? – Cmorales
Я не думаю, что происходит перенаправление, я изменил это утверждение на $ this-> assertRedirectedToAction ('UserController @ getLogin'); и он терпит неудачу с «Неверным утверждением, что Illuminate \ Http \ Response Object (...) является экземпляром класса« Illuminate \ Http \ RedirectResponse ».» – Cmorales