在 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-&gt;has('start_date') ? 'has-error' : '',然后它必须先检查$errors,然后你可以检查has 函数所以检查应该是这样的 @if(isset($errors) &amp;&amp; $errors-&gt;has('start_date')) has-error @endif 所以这真的很烦人有没有人知道任何解决方法? 【参考方案1】:

除了检查isset() 之外,没有其他解决方法。单元测试旨在测试后端,而不是表单。

来自wikipedia:

在过程式编程中,一个单元可以是一个完整的模块,但更常见的是一个单独的函数或过程。在面向对象编程中,一个单元通常是一个完整的接口,例如一个类,但也可以是一个单独的方法。

如果您想测试表单和用户界面的行为,请使用前端测试框架,例如selenium。

【讨论】:

以上是关于在 Laravel 中测试具有部分视图的表单时,Phpunit 会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Laravel 测试两个具有相同输入名称的表单

如何在 Django 中测试具有表单的视图?

Laravel:重复字段(和字段组):表单模型绑定

Laravel:使用 AJAX 请求渲染部分视图

如果关系项不在 Laravel 的请求中,则删除它

Laravel 表单返回,共享主机上的 500 服务器错误