Я новичок в Laravel и концепции IoC. Я следил за отличными руководствами по Nettuts (http://net.tutsplus.com/tutorials/php/testing-laravel-controllers/) и смог успешно протестировать мой контроллер. Однако я хотел изолировать контроллер, издеваясь над базой данных. Как только я попытался внедрить свой издевательский объект в IoC, я получаю следующую ошибку:
Невозможно изменить информацию заголовка — заголовки уже отправлены (вывод начался в /Users/STRATTON/Dev/SafeHaven/vendor/phpunit/phpunit/PHPUnit/Util/Printer.php:172)
Строка, на которую он ссылается, выводит буфер PHPUnit с помощью конструкции «print». Что-то вызывает отправку вывода до установки заголовков, но я не могу отследить проблему.
Я могу успешно выполнить все свои тесты, когда контроллер вызывает реальную модель и выполняет вызов базы данных. В то же время я могу успешно издеваться над объектом и выполнять макет без ошибок. Но как только я пытаюсь ввести издевательский объект с помощью App::instance(), появляется ошибка.
Я также проверил это с помощью макетов PHPUnit и получил те же результаты. Правильно ли я издеваюсь над объектом? У меня проблемы с пространством имен? Я пропустил что-то, что выводит контент?
Контроллер:
<?php namespace App\Controllers;
use App\Models\Repositories\ArticleRepositoryInterface;
class HomeController extends BaseController {
protected $articles;
public function __construct(ArticleRepositoryInterface $articles)
{
$this->articles = $articles;
}
public function index()
{
$articles = $this->articles->recent();
return \View::make('home.index')
->with('articles', $articles);
}
}
Прецедент
<?php namespace Tests\Controllers;
class HomeControllerTest extends \TestCase {
public function testIndex()
{
$mocked = \Mockery::mock('App\\Models\\Repositories\\ArticleRepositoryInterface');
$mocked->shouldReceive('recent')->once()->andReturn('foo');
\App::instance('App\\Models\\Repositories\\ArticleRepositoryInterface', $mocked);
//$mocked->recent();
$this->call('GET', '/');
$this->assertResponseOk();
$this->assertViewHas('articles');
}
}