Ожидаемые ошибки в 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
в этих типах сценариев.