Laravel 8 测试 GET http 请求误报

Posted

技术标签:

【中文标题】Laravel 8 测试 GET http 请求误报【英文标题】:Laravel 8 test GET http request false positive 【发布时间】:2021-01-25 09:05:32 【问题描述】:

我正在尝试编写带有一些断言的测试。 这是一个简单的 GET 请求示例,我希望它会失败,因为页面上缺少文本。但是,它给了我绿色。当我检查响应内容时,我清楚地看到它抛出错误。我正在使用 laravel 8。

<?php

namespace Tests\Feature;

use Carbon\Carbon;
use Tests\TestCase;
use App\Models\Concert;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class ViewConcertListingTest extends TestCase

    use DatabaseMigrations;

    /** @test */
    function user_can_view_a_concert_listing() 
        $concert = Concert::create([
            'title' => 'The Red Chord',
            'subtitle' => 'with Animosity and Lethargy',
            'date' => Carbon::parse('December 13, 2016 8:00pm'),
            'ticket_price' => 3250,
            'venue' => 'The Mosh Pit',
            'venue_address' => '123 Example Lane',
            'city' => 'Laraville',
            'state' => 'ON',
            'zip' => '17916',
            'additional_information' => 'For ticket, cal (555) 555-5555.',
        ]);

        $view = $this->get('/concerts/'.$concert->id);

        $view->assertSee('The Red Chord');
        $view->assertSee('with Animosity and Lethargy');
        $view->assertSee('December 13, 2016');
        $view->assertSee('8:00pm');
        $view->assertSee('32.50');
        $view->assertSee('The Mosh Pit');
        $view->assertSee('123 Example Lane');
        $view->assertSee('Laraville, ON 17916');
        $view->assertSee('For tickets, call (555) 555-5555.');
    



【问题讨论】:

“当我检查响应内容时,我清楚地看到它抛出错误”这是什么意思?你看到什么错误信息?一些建议:您应该研究创建测试模型的工厂,应该使用route() 帮助程序而不是 URL,并且可以通过链接方法来减少代码。例如。 $this-&gt;get('/concerts/' . $concert-&gt;id)-&gt;assertSee('x')-&gt;assertSee('y')-&gt;assertDontSee('z'); 测试没有失败,但是成功了。这就是我所说的“当我检查响应内容时,我清楚地看到它抛出错误”。 【参考方案1】:
 protected function setUp() 
    parent::setUp(); 
    $this->withoutExceptionHandling();


laravel 在后台自动“处理”异常,并且从不将其抛出到我们的测试中。为了自己处理这个问题,我们需要使用 withoutExceptionHandling() 方法

【讨论】:

任何抛出异常的东西仍然无法通过测试。你的代码所做的只是让测试在异常处停止,因为它没有被捕获。 我必须为每个测试课程都这样做吗? 不,我个人在测试返回成功时在操作之前的函数中使用它,它应该返回 false,就像您使用 auth 中间件时一样

以上是关于Laravel 8 测试 GET http 请求误报的主要内容,如果未能解决你的问题,请参考以下文章

利用Http请求实现PHP异步(laravel5.4)

Laravel Cors 中间件不适用于 POST 请求

http 的8中请求方式:

Laravel 8 Fortify 登录显示 429 太多请求

如何在 Laravel-8 和 InertiaJs 中向服务器发出 POST 请求时在浏览器中保留当前的 ​​GET url

在 laravel 中使用错误的 http 请求类型(例如 get 而不是 post)时返回 404