我是 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 的缓冲区。某些东西导致在设置标头之前发送输出,但我无法找到问题所在。
当控制器调用真实模型并进行数据库调用时,我能够成功运行所有测试。同时,我能够成功地模拟对象并毫无错误地进行模拟。但是,一旦我尝试使用 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');
}
}