我在尝试在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
作为
# 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和嘲弄测试。
我在互联网上找不到这个特别危险的错误代码,所以在没有进一步帮助的情况下我感到很茫然。
答案 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
}
所以我必须特别检查以下修改过的文件:
答案 1 :(得分:6)
也发生在Laravel 5中 当响应格式不正确时,PHPUnit将抛出此内容。
可能是由于:
@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;。
因此,如果您遇到同样的问题,请检查视图文件中的那种错误。