Не удалось создать шпиона для объекта ngForm: не удалось найти объект для слежки

#angular #jasmine #karma-jasmine

#angular #jasmine #карма-жасмин

Вопрос:

У меня возникли проблемы с созданием шпиона для NgForm объекта. Я использую компонент Angular11.

Мой тест в основном выглядит так (сокращенно):

   let component: AuthComponent;
  let fixture: ComponentFixture<AuthComponent>;

  beforeEach(() => {
    TestBed.resetTestEnvironment();
    TestBed.initTestEnvironment(BrowserDynamicTestingModule, 
      platformBrowserDynamicTesting());
    ....
    fixture = TestBed.createComponent(AuthComponent);
    ....
  }
 

И

 describe('onSubmit', () => {
    it('makes expected calls', () => {
      const ngFormStub: NgForm = <NgForm>{};
      spyOn(ngFormStub, 'resetForm').and.callThrough();
      component.onSubmit(ngFormStub);
      expect(ngFormStub.resetForm).toHaveBeenCalled();
    });
  });
 

Нужно ли мне каким-то образом получать значение ngFormStub из прибора? Я попробовал это, и это не сработало:

 const ngFormStub: NgForm = component.form; // this didn't work
 

Но мой тест показывает эту ошибку:

 Error: <spyOn> : could not find an object to spy upon for resetForm()
 

ПРИМЕЧАНИЕ: в моем компоненте onSubmit() метод завершается вызовом form.resetForm() , что я и пытаюсь протестировать.

Вот моя конфигурация тестирования проектов:

 "jasmine": "^3.6.3",
"jasmine-core": "^3.6.0",
"jasmine-spec-reporter": "^6.0.0",
"karma": "^5.2.3",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.1",
"karma-jasmine": "^4.0.1",
"karma-jasmine-html-reporter": "^1.5.4",
 

Комментарии:

1. ты пробовал const ngFormStub: NgForm = new NgForm([], []); ? ( github.com/angular/angular/blob/11.0.2/packages/forms/src /… )

Ответ №1:

Оказывается, мне нужно было подделать ссылку на метод следующим образом:

   ....
  fixture.detectChanges();
  const ngFormStub: NgForm = <NgForm>{
    resetForm: () => null,
    value: {
      email: "test@test.com",
      password: "password"
    },
    valid: true
  };
  ....
 

Кроме того, мне нужно было это:

 TestBed.configureTestingModule({
      declarations: [AuthComponent],
      imports: [FormsModule, ReactiveFormsModule],
....