Ожидаемые ошибки в Laravel Dusk

Я ищу Laravel Dusk эквивалент

this->expectException(InvalidArgumentException::class); 

Я новичок в использовании Laravel Dusk (работает с Laravel 5.7) и не могу найти способ проверить наличие ожидаемой ошибки. Когда я запускаю следующий тест.

Я получаю следующее:

Была 1 ошибка:

1) Tests \ Browser \ RegistrationTest:: test_user_cannot_register_with_duplicate_email Illuminate \ Database \ QueryException: SQLSTATE [23000]: нарушение ограничения целостности: 19 Сбой ограничения UNIQUE: users.email (SQL: вставить в "users" ("name", "email", значения "password", "updated_at", "made_a t") (Eoj, joe@example.com, 654321, 2018-10-16 20:35:09, 2018-10-16 20:35:09))

Вызвано PDOException: SQLSTATE[23000]: Нарушение ограничения целостности: 19 Сбой ограничения UNIQUE: users.email

ОШИБКИ! Тесты: 4, Утверждения: 5, Ошибки: 1.

public function test_user_cannot_register_with_duplicate_email()
{
    User::create([
        'name' => 'Eoj',
        'email' => 'joe@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', 'joe@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");
    });

}

Очевидно, я ожидал ошибку - но не могу понять, как сказать сумерки это.

Когда я изменяю свой код на следующий, я получаю другую ошибку:

1)> Tests \ Browser \ RegistrationTest:: test_user_cannot_register_with_duplicate_email Не увидел ожидаемый текст [Письмо уже было получено] в элементе [body]. Не удалось утверждать, что ложь - это правда.

Я не запускаю никаких других тестов в данный момент.

    <?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");
    });

}

}

1 ответ

Как вы можете видеть в ошибке:

Tests \ Browser \ RegistrationTest:: test_user_cannot_register_with_duplicate_email Illuminate \ Database \ QueryException: SQLSTATE [23000]: нарушение ограничения целостности: 19 Не удалось выполнить ограничение UNIQUE: users.email (SQL: вставить в "users" ("name", "email", "password") значения "," updated_at "," creation_a t ") (Eoj, joe@example.com, 654321, 2018-10-16 20:35:09, 2018-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

И ваш тест должен расширить этот класс:

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

Таким образом данные будут сброшены, избегая дублирования электронной почты в последующих тестах.

Я думаю, что проблема в том, что вы не ожидаете ответа от сервера (вы отправляете форму через js, верно?), И утверждение срабатывает слишком рано. Просто используйте waitFor или же waitForText в этих типах сценариев.

Другие вопросы по тегам