在 Laravel 中测试具有部分视图的表单时,Phpunit 会引发错误
Posted
技术标签:
【中文标题】在 Laravel 中测试具有部分视图的表单时,Phpunit 会引发错误【英文标题】:Phpunit throws an error when testing a form which has a partial view in Laravel 【发布时间】:2015-11-15 23:59:28 【问题描述】:我最近开始编写单元测试,所以这个概念本身对我来说还不是很清楚,我正在尝试通过在我目前正在进行的项目上编写单元测试来学习它。
我已经测试了身份验证,一切都很好;但是,当我想测试表单提交时,它会抛出以下错误:
'ErrorException' with message 'Undefined variable: errors'
当我调试时,我发现视图变量$errors
没有为 phpunit 定义。我正在测试的表单被抽象为一个部分视图,以供 CREATE/UPDATE
引用,但事实证明 Phpunit 无法处理部分视图。
当我从我正在测试的视图中评论@include('view.name')
时,我已经对其进行了测试,它通过了它。
我的问题是是否有任何解决方法。如何测试具有部分视图的视图?
例外:
Caused by
exception 'ErrorException' with message 'Undefined variable: errors' in /Users/***/Developpement/***/storage/framework/views/36f0b5638ab33 be6eca70d4986f07ad2:2
Stack trace:
#0 /Users/***/Developpement/***/storage/framework/views/36f0b5638ab33 be6eca70d4986f07ad2(2): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Undefined varia...', '/Users/***/D...', 2, Array)
#1 /Users/***/Developpement/***/vendor/laravel/framework/src/Illumina te/View/Engines/PhpEngine.php(42): include('/Users/***/D...')
#2 /Users/***/Developpement/***/vendor/laravel/framework/src/Illumina te/View/Engines/CompilerEngine.php(58): *** minate\View\Engines\PhpEngine->evaluatePath('/Users/***/D...', Array)
#3 /Users/***/Developpement/***/vendor/laravel/framework/src/Illumina te/View/View.php(138): Illuminate\View\Engines\CompilerEngine- >get('/Users/***/D...', Array)
父视图
<div class="container">
!! Form::open(['route' => 'admin.festivals.create.post', 'enctype' => 'multipart/form-data']) !!
<legend>Create</legend>
<div class="pull-right">
<a class="btn btn-info" href=" route('admin.festivals.list')">Home</a>
</div>
// HERE IS THE LINE WHEN I COMMENT IT IT WORKS
--@include('admin.festivals._form')--
!! Form::submit('Create', ['class' => 'btn btn-primary col-md-2']) !!
!! Form::close() !!
</div>
局部视图
<div class="form-group row $errors->has('start_date') ? 'has-error' : '' ">
<label class="control-label col col-md-2" for="start_date">Start Date</label>
<div class="col col-md-4">
!! Form::datepicker('start_date', (isset($festival)) ? $festival->start_date : null) !!
!! $errors->first('start_date', '<span class="help-block">:message</span>') !!
</div>
【问题讨论】:
经过一天的挖掘,我发现 phpunit 无法检查一行中的 if 语句$errors->has('start_date') ? 'has-error' : ''
,然后它必须先检查$errors
,然后你可以检查has
函数所以检查应该是这样的 @if(isset($errors) && $errors->has('start_date')) has-error @endif
所以这真的很烦人有没有人知道任何解决方法?
【参考方案1】:
除了检查isset()
之外,没有其他解决方法。单元测试旨在测试后端,而不是表单。
来自wikipedia:
在过程式编程中,一个单元可以是一个完整的模块,但更常见的是一个单独的函数或过程。在面向对象编程中,一个单元通常是一个完整的接口,例如一个类,但也可以是一个单独的方法。
如果您想测试表单和用户界面的行为,请使用前端测试框架,例如selenium。
【讨论】:
以上是关于在 Laravel 中测试具有部分视图的表单时,Phpunit 会引发错误的主要内容,如果未能解决你的问题,请参考以下文章