1

私は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');
    }

}
4

2 に答える 2