Php 拉拉维尔黄昏的预期误差

Php 拉拉维尔黄昏的预期误差,php,laravel-5,laravel-dusk,Php,Laravel 5,Laravel Dusk,我要找的是相当于拉威尔黄昏的 this->expectException(InvalidArgumentException::class); 我不熟悉使用LaravelDask(运行Laravel5.7),无法找到测试预期错误的方法。当我运行下面的测试时 我得到以下信息: 有1个错误: (一) Tests\Browser\RegistrationTest::test\u用户\u无法使用\u重复的\u电子邮件注册\u Illumb\Database\QueryException:SQLS

我要找的是相当于拉威尔黄昏的

this->expectException(InvalidArgumentException::class); 
我不熟悉使用LaravelDask(运行Laravel5.7),无法找到测试预期错误的方法。当我运行下面的测试时

我得到以下信息:

有1个错误:

(一) Tests\Browser\RegistrationTest::test\u用户\u无法使用\u重复的\u电子邮件注册\u Illumb\Database\QueryException:SQLSTATE[23000]:完整性 约束冲突:19唯一约束失败:users.email(SQL: 插入“用户”(“姓名”、“电子邮件”、“密码”、“更新地址”), “创造”价值(Eoj,joe@example.com, 654321, 2018-10-16 20:35:092018-10-16 20:35:09)

由PDO异常引起:SQLSTATE[23000]:完整性约束 违反:19唯一约束失败:users.email

错误!测试:4,断言:5,错误:1

很明显,我期待着一个错误,但不知道如何告诉黄昏这一点

当我将代码更改为以下内容时,会出现不同的错误:

1) >测试\浏览器\注册测试::测试\用户\无法\使用\重复\电子邮件\注册\测试 在元素[正文]中未看到预期的文本[电子邮件已被接收]。 断言false为true失败

我目前没有运行任何其他测试

    <?php

namespace Tests\Browser;

use App\User;
use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\RefreshDatabase;


class RegistrationTest extends DuskTestCase

{
    use RefreshDatabase;

protected function setUp()
{
    parent::setUp();
    foreach (static::$browsers as $browser) {
        $browser->driver->manage()->deleteAllCookies();
    }
}

public function test_user_cannot_register_with_duplicate_email()
{
    User::create([
        'name' => 'Eoj',
        'email' => 'someone@example.com',
        'password' => '654321'

    ]);

    $this->browse(function ($browser) {
        $browser->visit('/') //Go to the homepage
        ->clickLink('Register') //Click the Register link
        ->assertSee('Register') //Make sure the phrase in the argument is on the page
        //Fill the form with these values
        ->value('#name', 'Joe')
            ->value('#email', 'someone@example.com')
            ->value('#password', '123456')
            ->value('#password-confirm', '123456')
            ->click('button[type="submit"]') //Click the submit button on the page
            ->assertPathIs('/register') //Make sure you are still on the register page
            //Make sure you see the phrase in the argument
            ->assertSee("The email has already been taken");
    });

}

正如您在错误中看到的:

Tests\Browser\RegistrationTest::test\u user\u无法使用\u duplicate\u email\Database\QueryException:SQLSTATE[23000]:完整性约束冲突:19唯一约束失败:users.email(SQL:插入“users”(“name”、“email”、“password”、“updated\u at”、“created\u a t”)值(Eoj,joe@example.com,6543212018-10-16 20:35:092018-10-16 20:35:09)

这些值正是您尝试在此处插入的值:

User::create([
    'name' => 'Eoj',
    'email' => 'joe@example.com',
    'password' => '654321'
]);
因此,您可以将此电子邮件更改为其他电子邮件:

User::create([
    'name' => 'Eoj',
    'email' => 'someone@example.com',
    'password' => '654321'
]);
这里再次强调,测试是有意义的:

->value('#email', 'someone@example.com')
这样,电子邮件就不会被复制,因为在某个时候你已经有了一个“joe@example.com“

一个好的做法是在测试之前重置数据库

tests/TestCase.php
中,您可能会遇到如下情况:

use Illuminate\Foundation\Testing\RefreshDatabase; //<--HERE

abstract class TestCase extends BaseTestCase
{
    use RefreshDatabase; //<--HERE

使用lightlight\Foundation\Testing\RefreshDatabase;//我认为问题在于您没有等待服务器的答复(您是通过js提交表单的,对吗?),断言触发得太早。在这些类型的场景中,只需使用
waitFor
waitForText

似乎您的注册用户的代码有问题,而不是测试。您可能希望共享保存用户的控制器/模型代码。您得到的是现成的Laravel Auth/RegisterController.phper运行make:auth。当我在浏览器中测试它时,它会按预期工作(即,当数据库中已经存在电子邮件时,不允许您注册用户)。我还应该添加注册新唯一用户的测试。您是否已经有电子邮件
joe@example.com
在您的数据库中?您可能需要使用
RefreshDatabase
trait。似乎
User::create([…])
在您的测试中是引发此错误的电子邮件。请将此电子邮件更改为完全不同的电子邮件,然后重试。我认为您不理解我想说的内容。您的测试正在尝试插入一封已经重复的电子邮件。这就是您出现此错误的原因。请将此电子邮件更改为不同的电子邮件,无论是在
用户::创建
中还是在
->值中(“#电子邮件”、“…”)
很抱歉,Fellipe,但是您完全误解了我正在运行的测试的全部要点。我正在尝试检查是否无法创建重复的用户-因此数据库中需要有重复的记录!我已经在使用RefreshDatabase。您阅读了我发布的内容吗?您已经手动插入了重复的ent你有没有试着按照我说的去做?按照你说的去做会创建一个新用户…这不是我想做的!!这是一个关于如何在Laravel Dash中预期类似于This->expectException(InvalidArgumentException::class)的错误的问题;在phpunitLet中,请考虑一下。您测试的目的是检查在尝试注册重复电子邮件时,应用程序是否应返回“电子邮件已被接收”。因此,首先手动注册电子邮件,然后强制进行第二次注册。重点是您的第一次注册(
create
)已复制。这就是您需要更改此电子邮件的原因。
use Illuminate\Foundation\Testing\RefreshDatabase; //<--HERE

abstract class TestCase extends BaseTestCase
{
    use RefreshDatabase; //<--HERE
use Tests\TestCase; //<--HERE
class MyTest extends TestCase { //<--HERE