Тестирование формы ngForm Angular

У меня есть форма страницы входа, как показано ниже -

<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, используя Угловая ФормаГруппа, но я хотел бы сохранить форму такой, какая она есть, если это возможно.

совет, используйте реактивные формы, их можно протестировать намного проще, чем формы, управляемые шаблонами.

Fateh Mohamed 15.02.2019 16:33
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
1
201
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте это. Вы должны активировать изменить событие программно в поле ввода.

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 не получает уведомления об изменениях состояния/значения.

Sujit Kumar Singh 15.02.2019 18:59

Да, обновление элемента dom таким образом из вашей спецификации не будет отражено в представлении. Вы должны отправить событие изменения входного значения userInputElm.dispatchEvent(new Event('input'));.

Amit Chigadani 16.02.2019 13:11

Спасибо, Амит, это решение работает отлично. Я отредактировал ваш ответ, чтобы предоставить более подробную информацию.

Sujit Kumar Singh 17.02.2019 16:38

Другие вопросы по теме