У меня есть форма страницы входа, как показано ниже -
<form class = "login-form" #loginForm = "ngForm">
<input [(ngModel)] = "login.username" required = "true" type = "text" id = "username" name = "username"/>
<button [disabled] = "!loginForm.form.valid" label = "Login" class = "btn-login" type = "submit">Login</button>
</form>
Теперь тестовый пример для проверки отключенного/включенного состояния кнопки входа в систему -
describe('Login button status', () => {
let loginBtn, userInputElm;
beforeEach(() => {
loginBtn = fixture.nativeElement.querySelector('.btn-login');
userInputElm = fixture.nativeElement.querySelector('input#username');
fixture.detectChanges();
});
it('should be enabled if "username" is provided', () => {
userInputElm.value = 'validusername';
// component.login.username = 'validuser'; <-- also tried this
fixture.detectChanges();
// loginBtn = fixture.nativeElement.querySelector('.btn-login'); <-- tried this (same result)
// button should be enabled
expect(loginBtn.disabled).toBe(false); <-- Button still remains disabled
});
});
Поскольку angular не получает уведомления об изменениях поля #username, он не меняет статус кнопки входа. Что я могу сделать, чтобы успешно проверить это? Необходимо уведомлять Angular об изменениях.
Я уже импортировал FormsModule в модуль конфигурации TestBed.
Я знаю, что могу делать что-то в Angular, используя Угловая ФормаГруппа, но я хотел бы сохранить форму такой, какая она есть, если это возможно.





Попробуйте это. Вы должны активировать изменить событие программно в поле ввода.
it('should be enabled if "username" is provided', () => {
userInputElm.value = 'validusername';
userInputElm.dispatchEvent(new Event('input'));
fixture.detectChanges();
// button should be enabled
expect(loginBtn.disabled).toBe(false);
});
Мне очень жаль, Амит, что я забыл добавить этот проверенный вариант в свой вопрос. Это также вызвало кнопку с отключенным атрибутом (что правильно). Проблема в том, что Angular не получает уведомления об изменениях состояния/значения.
Да, обновление элемента dom таким образом из вашей спецификации не будет отражено в представлении. Вы должны отправить событие изменения входного значения userInputElm.dispatchEvent(new Event('input'));.
Спасибо, Амит, это решение работает отлично. Я отредактировал ваш ответ, чтобы предоставить более подробную информацию.
совет, используйте реактивные формы, их можно протестировать намного проще, чем формы, управляемые шаблонами.