私は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 で開始された出力)
それが参照している行は、'print' コンストラクトを使用して PHPUnit のバッファを出力します。ヘッダーが設定される前に出力が送信される原因が何かありますが、問題を突き止めることはできません。
コントローラーが実際のモデルを呼び出してデータベース呼び出しを行うと、すべてのテストを正常に実行できます。同時に、オブジェクトを正常にモックし、エラーなしでモックを実行できます。しかし、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');
}
}