Подтвердить что ты не робот

Laravel 5.1 PHPUnit - press() дает мне "недоступное поле" "

При попытке вызвать метод press() я всегда получаю

InvalidArgumentException: недостижимое поле ""

в этой строке.

Согласно документам:

"Нажмите кнопку" a "с заданным текстом или именем.

Мой метод:

press('Create') 

и моя кнопка

<button class="btn btn-lg btn-primary" type="submit" name="submit">Create</button> 

Я также попытался использовать name с тем же результатом.

Я также пробовал submitForm('Create'), который работает, но тогда seeInDatabase('employees', ['email' => '[email protected]']) всегда терпит неудачу.

Невозможно найти строку в таблице базы данных [employee], которая соответствует атрибутам [{ "email": "[email protected]" }].

Вот мой полный метод

public function testExample()
{

  $this->actingAs(\App\Employee::where('username', 'grant')->first())
    ->visit('/employees/create')
    ->type('john', 'username')
    ->type('1234', 'password')
    ->type('[email protected]', 'email')
    ->submitForm('Create')
    ->seeInDatabase('employees', ['email' => '[email protected]'])
    ->see('Employee Directory');
}

ОБНОВЛЕНИЕ 1

Вот моя форма:

{!! Form::open(['route' => 'employees.store', 'method' => 'POST']) !!}
  @include('employees.form')
{!! Form::close() !!}

Как вы можете видеть, мои поля не находятся за пределами формы.

4b9b3361

Ответ 1

Я не знаю, какова конкретная причина вашей проблемы, но это может быть несколько вещей. Я бы прокомментировал, но пока у меня недостаточно репутации.

Во-первых, вы запустили свой простой html файл через валидатор? Если он дает вам какие-либо синтаксические ошибки, попробуйте исправить их и снова запустите unit test. (Вы можете попробовать этот https://validator.w3.org/, просто скопируйте и вставьте свой html)

Другая причина может заключаться в том, что у вас есть javascript, который изменяет ваши тесты DOM и Laravel, не может справиться с этим.

И, наконец, вы можете попытаться установить атрибут 'value' вашего <button> на "Создать"

<button class="btn btn-lg btn-primary" type="submit" name="submit" value="Create">Create</button>

Или измените <button> на <input> с атрибутом type "submit" и value на "Create"

<input type="submit" class="btn btn-lg btn-primary" name="submit" value="Create" />

Ответ 2

Из опыта, недостижимые ошибки поля обычно вызваны кнопками, находящимися за пределами элемента <form>, у меня есть сценарий similair, где другой раздел страницы передается контроллеру через $request, но поскольку он не в том же непосредственном элементе формы, что и все остальное, PHPUnit не может ассоциировать его с формой.

Возможно, стоит изменить метод от press() до click(), который просто ищет что-то, на что он может щелкнуть вообще, а не пытаться сопоставить кнопку отправки с формой.

Как уже упоминалось выше, PHPUnit не может самостоятельно тестировать JavaScript (если вы используете Javascript, конечно), вам нужно что-то вроде Selenium для этого.

Без разметки довольно сложно сказать, не могли бы вы разместить разметку своей формы?

Ответ 3

Основная причина этого заключается в том, что у вас есть кнопка отправки, которая выглядит так. <button type="submit" name="submit" class="btn btn-primary">Submit</button>. Когда вы меняете текст кнопки на другой текст, кроме Submit, он будет работать нормально. например, <button type="submit" name="submit" class="btn btn-primary">Create</button>.

Ответ 4

Предыдущие предложения не охватывают деловую необходимость наличия двух кнопок отправки с одинаковым значением.

Что нам нужно сделать, переопределите стандартное выражение Laravel XPath.

Вместо того, чтобы найти первый экземпляр второй кнопки отправки с текстом, мы расскажем Laravel, чтобы найти элемент с определенным XPath нашего (вторая кнопка отправки).

    $this->visit(route('user.login'));

    // replace `login-btn-2` with the id of your second button
    $button = $this->crawler->filterXPath('//*[@id="login-btn-2"]'); 

    $form = $button->form($inputs = ['email' => $user->email, 'password' => $password,]);

    $this->makeRequestUsingForm($form);

    $this->see(route('user.loggedin.dashboard'));

Дополнительный кредит Если вы новичок в XPath, вы можете щелкнуть правой кнопкой мыши по проверенному исходному коду в браузере Chrome. Вы можете выбрать Copy > Copy as XPath

Ответ 5

Вы можете обнаружить, что он работает с методом submitForm:

$this->submitForm('Create', ['username' => 'john']);