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() !!}
Как вы можете видеть, мои поля не находятся за пределами формы.
Ответы
Ответ 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']);