Laravel 4 phpunit test:测试标记为“risky”,因为它没有关闭自己的输出缓冲区

时间:2014-06-25 10:04:34

标签: laravel laravel-4 phpunit

我在尝试在phpunit测试中测试一个简单的Illuminate \ Http \ Response对象时遇到了问题。有问题的错误是:

PHPUnit 4.3-dev by Sebastian Bergmann.

Configuration read from /var/MyApp/phpunit.xml

....................R.................

Time: 2.71 seconds, Memory: 76.75Mb

OK, but incomplete, skipped, or risky tests!
Tests: 38, Assertions: 55, Risky: 1.     

phpunit --tap作为

运行时显示R
# RISKY Test code or tested code did not (only) close its own output buffers

我想测试的课程是:

class PrettyError {

    /**
     * Renders a pretty 500 error page view
     *
     * @return string with error view
     */
    public function render()
    {
             return Response::make(View::make('viewName')->with('param','value')->render(), 500, array());
    }
}

并且测试是

class Pretty500Test extends BaseTest {

    /** @var Pretty500 */
    private $pretty500;

    /**
     * Set dependencies
     */
    public function __construct()
    {
        $this->pretty500 = app(PrettyError::class);
    }

    public function testRender()
    {
        $response = $this->pretty500->render();

        //assertions below, never get reached cause tests aborts after above call
        $this->assertsTrue('500',$response->getStatus());
    }

}    

请注意,使用laravel

在我的应用中测试任何路线时会发生相同的错误

this->route('GET','routeName')

helper方法,所以这似乎是与Response请求相关的一般错误。据我所知,我的应用程序中没有任何东西可以通过输出缓冲(故意)做任何有趣的事情,这是我唯一能想到的可能会破坏Response类的标准工作。

我正在使用phpunit 4.3-dev,laravel 4.2.1和嘲弄测试。

我在互联网上找不到这个特别危险的错误代码,所以在没有进一步帮助的情况下我感到很茫然。

5 个答案:

答案 0 :(得分:8)

封闭的三元运算符(?)

不够好

在Laravel 5中测试时,我遇到了与风险测试用例相同的问题。这里的问题是,我的导航中有如下代码(默认布局文件):

<li{{ Request::is('clients*')?' class="active"':'' }}><a href="/clients">Clients</a></li>

测试不喜欢这个部分,因为三元运算符(?)没有足够好地关闭。我用以下内容替换它以使其工作(在三元运算符部分添加了parantheses):

<li{{ (Request::is('clients*')?' class="active"':'') }}><a href="/clients">Clients</a></li>

我通过从请求的视图,扩展的布局和包含的文件中逐部删除刀片语法来发现这一点。在删除上面的语法时,它工作,所以有错误。

空产量/部分

当我为一个yield传递一个空值时发生了同样的错误,例如在下面的场景中:

<强> layout.blade.php

<h1>@yield('title')</h1>

<强> page.blade.php

@extends('layout')    
@section('title','') //<-- This empty value raised the error

需要考虑的其他事项

也许清楚,但万一你犯了同样的错误:你必须检查所有涉及的文件。

我运行了以下测试,访问登录页面,输入电子邮件和密码并按下登录按钮:

<强>测试/ AuthenticationTest.php

<?php
class AuthenticationTest extends TestCase
{
    // [...]

    public function testLoginSuccessful()
    {
        $password = str_random();

        $user = factory(App\User::class)->create(['password' => $password]);

        $this->visit(route('login'))
            ->type($user->email, 'email')
            ->type($password, 'password')
            ->press('Login')
            ->seePageIs(route('dashboard2'));
    }
}

应用/ HTTP / routes.php文件

<?php
Route::get('auth/login',    'Auth\AuthController@getLogin')->name('login');
Route::post('auth/login',   'Auth\AuthController@postLogin');

应用/ HTTP /控制器/认证/ AuthController.php

<?php    
// [...]
class AuthController extends Controller
{
    // [...]

    protected $redirectPath = '/dashboard2'; // <-- check this file as well
}

所以我必须特别检查以下修改过的文件:

  • 应用程序/ HTTP / routes.php文件
  • app / Http / Controllers / Auth / AuthController.php - &gt; function getLogin
  • resources / views / auth / login.blade.php(在Auth \ AuthContoller @ getLogin中返回)
  • app / Http / Controllers / Auth / AuthController.php - &gt;功能postLogin
  • resources / views / dashboard2.blade.php(成功登录时返回)

答案 1 :(得分:6)

也发生在Laravel 5中 当响应格式不正确时,PHPUnit将抛出此内容。

可能是由于:

  • Laravel app中的错误:检查日志
  • 刀片语法不正确:例如在我的情况下,有一个过多的刀片@stop,Laravel不会将其视为错误(并且未被记录)

答案 2 :(得分:1)

原来问题是由于有问题的视图使用

Input::old()

在表单中。在尝试在任何phpunit测试中简单地访问Input::old('foo')之后,我得到了一个

RuntimeException: Session store not set on request.

因此真正的罪魁祸首是在我的单元测试中的会话存储中,而不是任何请求/视图渲染问题。通过在testRender()方法中设置当前Request实例的会话存储来解决问题:

\Illuminate\Support\Facades\Request::setSession($this->app['session.store'])

答案 3 :(得分:1)

我有来自PhpUnit的相同错误消息喜欢你的..我在视图(刀片)文件中的错误行上写了'@stop'..我已经编辑了向右移动'@stop'到右行而不是PHPUnit测试通过了!

尝试检查刀片文件中的@section @stop块。

答案 4 :(得分:0)

我的问题非常相似。问题是我试图在视图中获取非对象(NULL)的属性,而不是PHP错误&#39;尝试获取非对象的属性&#39; phpunit显示“好”,但不完整,跳过或冒险测试!&#39;。

因此,如果您遇到同样的问题,请检查视图文件中的那种错误。