【问题标题】:Silent undefined variable in view when testing laravel route测试 laravel 路由时视图中的静默未定义变量
【发布时间】:2019-01-17 21:15:17
【问题描述】:

我的 laravel 项目中有一个 deliverypoint 资源。与路由 deliverypoints.index 关联的控制器代码很简单:

public function index()
{
    return view('deliverypoints.index', [
        'deliverypoints' => DeliveryPoint::all(),
    ]);
}

同视图deliverypoints.index

@extends('layouts.app')

@section('content')
<div class="container">
  <ul class="row">
    @foreach ($deliverypoints as $deliverypoint)
      <li class="col-12">{{ $deliveryPoint->id }}</li>
    @endforeach
  </ul>
</div>
@endsection

在这里,您可以看到 li 标记中的拼写错误:deliveryPoint-&gt;id 而不是 deliverypoint-&gt;id。当我在浏览器中手动测试路由时,这会导致“未定义变量”错误:到目前为止,非常好。

我的问题是用 PHPUnit 测试路由时,测试通过而不是报错。这是功能测试的代码:

public function testIndex()
{
    $response = $this->get(
        route('deliverypoints.index')
    );

    $response->assertSuccessful()->assertViewIs(
        'deliverypoints.index'
    )->assertViewHasAll(
        ['deliverypoints']
    );
}

既然测试通过了,我猜这个视图已经被服务器成功返回了,但我希望能检测到错字。

如何强制执行测试以使其看到此类错误?

我将 laravel v5.6 与 PHP v7.1.18 和 PHPUnit v7.2.6 一起使用。

编辑:

我尝试使用以下方法清除缓存:

php artisan cache:clear
php artisan view:clear
php artisan route:clear

但仍然没有检测到错误。

【问题讨论】:

    标签: php laravel testing laravel-5 phpunit


    【解决方案1】:

    我建议在继续之前添加 200 支票

    $this->assertEquals(200, $response->status());
    

    我已尝试复制您遇到的问题,并且测试中的响应与浏览器中的响应相同:两种情况下都是 500 响应。

    【讨论】:

    • 感谢您的建议。 200 检查通过$response-&gt;assertSuccessful 执行。为了以防万一,我和你交换了我的代码,但结果相同:测试通过
    【解决方案2】:

    我找到了答案:数据库没有播种DeliveryPoint 实例。于是控制器通过DeliveryPoint::all和循环向视图发送一个空数组:

    @foreach ($deliverypoints as $deliverypoint)
      <li class="col-12">{{ $deliveryPoint->id }}</li>
    @endforeach
    

    没有被执行,错误消失了。

    使用工厂的可能修复:

    public function testIndex()
    {
        factory(DeliveryPoint::class)->create(); // seed the database
    
        $response = $this->get(
            route('deliverypoints.index')
        );
    
        $response->assertSuccessful()->assertViewIs(
            'deliverypoints.index'
        )->assertViewHasAll(
            ['deliverypoints']
        );
    }
    

    【讨论】:

      猜你喜欢
      • 2014-03-04
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多