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