#laravel #testing #hidden #laravel-livewire #laravel-models
#laravel #тестирование #скрытый #laravel-livewire #laravel-модели
Вопрос:
У меня есть простой компонент LiveWire, состоящий из формы для создания нового пользователя, и я могу сказать, что он работает, поскольку меня попросили написать тесты после того, как проект уже достиг стадии разработки.
Компонент Livewire использует new User
экземпляр (не существующий, т. Е. user->exists
is false
) для хранения вставленных данных перед их сохранением, а user
модель скрывает атрибут пароля через защищенный $hidden
массив.
Теперь я могу успешно создавать новых пользователей через страницу формы в моей локальной среде, но когда дело доходит до тестирования, это выдает ошибку.
Тест
Livewire::test(
FormComponent::class,
)
->set('user.name', 'user name')
->set('user.email', 'user@email.com')
->set('user.password', 'password')
->assertSet('user.name', 'user name')
->assertSet('user.email', 'user@email.com')
->assertSet('user.password', 'password');
Ошибка
Failed asserting that null matches expected 'password'.
Что я выяснил
Установка моего экземпляра compoment user через страницу формы проходит нормально, потому что livewire распознает его как a model
, поэтому сделайте что-то вроде user->password = 'password'
, в то время как при настройке его из теста с set()
помощью него доступ к его свойству с помощью оператора access, поскольку это массив, т.Е.: user['password] = 'password'
.
Закомментировав ввод пароля в $hidden
массив, тест прошел. Это объяснит разницу в настройке свойства.
Заключение
Поскольку $hidden
массив предназначен для скрытия свойств модели в его представлении array / json, он не должен мешать автоматическим тестам, более того, при использовании собственных методов Livewire, поэтому для меня это выглядит как ошибка LiveWire.
Справка
Кто-нибудь сталкивался с этой ошибкой?
Обновление # 1
Для этого я открыл проблему на странице Livewire github.
Ответ №1:
Вы довольно хорошо диагностировали это. Когда Livewire сериализует пользовательскую модель, password
не включается, поскольку она находится в $hidden
массиве. Несмотря на то, что пользовательская модель еще не сохранена, сериализация такая же.
Я бы предположил, что все ваши поля ввода используют defer
модификатор, поэтому ваши поля работают в браузере; однако, когда вы вызываете set()
тест, он имитирует запрос Livewire, поэтому $hidden
атрибуты стираются.
Здесь я рекомендую альтернативное утверждение для проверки пароля. Попробуйте подтвердить, что созданный пользователь может войти в систему с выбранным паролем.
$this->assertTrue(
auth()->attempt(['email' => 'user@email.com', 'password' => 'password'])
);