Не удается протестировать скрытый атрибут модели laravel livewire с помощью assertSet

#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'])
);