Phpunit:在 laravel 中处理验证异常

Posted

技术标签:

【中文标题】Phpunit:在 laravel 中处理验证异常【英文标题】:Phpunit : hadling the validation exception in laravel 【发布时间】:2019-08-07 10:52:42 【问题描述】:

我已将throw Exception 转入handler.php,这样我就可以捕获exceptions 并查看errors,但是当我尝试执行validation checks 时,它会抛出一个异常,这是正确的,但在我的测试用例不是捕获exception,而是断言会话有错误。

/** @test*/
    public function a_thread_requires_a_title()

        $thread = make('App\Thread', ['title'=> null]);
        $this->post('threads', $thread->toArray())
            ->assertSessionHasErrors('title');
    

因为validation error 是一个异常,所以它会抛出一个异常,因为我已将handler.php 文件修改为

if(app()->environment() === "testing") throw $exception;

所以,我想做的是改变这个测试的环境,这样它就不会抛出一个“异常”

【问题讨论】:

把它放在你的测试方法的顶部:-$this->withoutExceptionHandling(); withoutExceptionhandling 它已经内置了? @senty 这个方法对我不起作用。我仍然收到验证异常。?有办法吗? Omg ..... 也有 withExceptionHandling .. 对不起,我在学习旧课程... 恰恰相反.. 谢谢一群人 :) 不用担心 - 快乐编码 【参考方案1】:

您可以在测试方法的顶部编写 2 个辅助方法:

$this->withoutExceptionHandling();$this->withExceptionHandling();

它们包含在 Laravel 的 'Illuminate\Foundation\Testing\Concerns\InteractsWithExceptionHandling' 特征中,您应该从测试中扩展抽象 TestCase 使用该特征。 (as mentioned here)

/** @test*/
public function a_thread_requires_a_title() 
    $this->withExceptionHandling();

    $thread = make('App\Thread', ['title'=> null]);
    $this->post('threads', $thread->toArray())
        ->assertSessionHasErrors('title');

【讨论】:

以上是关于Phpunit:在 laravel 中处理验证异常的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 API 中间件在 Laravel 中测试 PHPUnit 一个经过身份验证的用户?

使用 Laravel 5.2 的 PHPUnit 未找到自定义异常

Laravel phpunit 测试需要访问 API 服务进行用户验证

Laravel PHPUnit 测试运行产生异常 调度器创建后无法设置默认工厂

Laravel 5.3 - 避免在 phpunit 测试中发送松弛通知

Laravel PHPUnit测试运行产生异常创建调度程序后无法设置默认工厂