Php Laravel 4单元测试:“;“已发送邮件头”;使用App::instance注入模拟时出错

Php Laravel 4单元测试:“;“已发送邮件头”;使用App::instance注入模拟时出错,php,phpunit,laravel,laravel-4,mockery,Php,Phpunit,Laravel,Laravel 4,Mockery,我不熟悉拉雷维尔和国际奥委会的概念。我在Nettuts()上学习了大量的教程,并成功地测试了我的控制器。但是,我想通过模拟数据库来隔离控制器。当我尝试将模拟对象注入IoC时,我得到以下错误: 无法修改标题信息-标题已由发送(输出开始于/Users/STRATTON/Dev/SafeHaven/vendor/phpunit/phpunit/Util/Printer.php:172) 它引用的行使用“print”构造输出PHPUnit的缓冲区。某些原因导致在设置标题之前发送输出,但我无法跟踪问题 当

我不熟悉拉雷维尔和国际奥委会的概念。我在Nettuts()上学习了大量的教程,并成功地测试了我的控制器。但是,我想通过模拟数据库来隔离控制器。当我尝试将模拟对象注入IoC时,我得到以下错误:

无法修改标题信息-标题已由发送(输出开始于/Users/STRATTON/Dev/SafeHaven/vendor/phpunit/phpunit/Util/Printer.php:172)

它引用的行使用“print”构造输出PHPUnit的缓冲区。某些原因导致在设置标题之前发送输出,但我无法跟踪问题

当控制器调用真实模型并进行数据库调用时,我能够成功地运行所有测试。同时,我能够成功地模拟对象,并且能够毫无错误地进行模拟。但是,当我尝试使用App::instance()注入模拟对象时,就会出现错误

我还用PHPUnit的mock测试了这一点,得到了相同的结果。我是否正确地模拟了对象?我对名称空间有问题吗?我是否缺少输出内容的内容

控制器:

<?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错误或异常

在本例中,问题是从视图中引发的异常。视图希望方法recent()返回的值是一个有说服力的集合(illumb\Database\Eloquent\Collection),或者至少是视图可以迭代的内容

HomeControllerTest::TestIndex方法正在模拟对象,当调用recent()时,它返回“foo”。视图无法在字符串上迭代,因此会引发异常。下面是两种解决方案,后者允许测试视图是否接收到正确的对象类型

$mocked->shouldReceive('recent')
    ->once()
    ->andReturn([]);

如果您遇到类似的问题,请检查所有正在测试的代码,并确保您的测试实际满足所有需求/依赖性。。。或者使用TDD。。。我从一开始就应该做一些事情来避免这个问题。

回答我自己的问题-出现错误的原因是代码的某些部分导致抛出PHP错误或异常

在本例中,问题是从视图中引发的异常。视图希望方法recent()返回的值是一个有说服力的集合(illumb\Database\Eloquent\Collection),或者至少是视图可以迭代的内容

HomeControllerTest::TestIndex方法正在模拟对象,当调用recent()时,它返回“foo”。视图无法在字符串上迭代,因此会引发异常。下面是两种解决方案,后者允许测试视图是否接收到正确的对象类型

$mocked->shouldReceive('recent')
    ->once()
    ->andReturn([]);

如果您遇到类似的问题,请检查所有正在测试的代码,并确保您的测试实际满足所有需求/依赖性。。。或者使用TDD。。。我从一开始就应该做一些事情来避免这个问题。

这实际上是一个关于在运行测试用例期间如何处理异常的错误,但是已经修复了,只需运行composer update。

这实际上是一个关于在运行测试用例期间如何处理异常的错误,但是已经修复了,只需运行composer update。

即使下面的答案解决了上述问题,它也会带来另一个问题。如何在独立于视图的情况下测试控制器?尽管下面的答案解决了上述问题,但它确实提出了另一个问题。如何在独立于视图的情况下测试控制器?谢谢!PHPUnit现在输出异常,我实际上可以跟踪到问题!在问这个问题之前,我已经运行了composer update,所以这一定是一个全新的修复。哪个库导致了这个问题?这个提交实际上解决了它,还有一个关于提交的讨论,谢谢!PHPUnit现在输出异常,我实际上可以跟踪到问题!在问这个问题之前,我已经运行了composer update,所以这一定是一个全新的修复。哪个库导致了这个问题?这个提交实际上解决了这个问题,在