Модульный тест: ожидаем, что компонентная функция была вызвана из конструктора - PullRequest
1 голос
/ 16 января 2020

У меня есть следующий компонент:

export class MyComponent {
   constructor() { this.getStorageData(); }
   getStorageData() {...}
}

Я пытаюсь проверить следующий случай: после создания компонента должна была быть вызвана функция getStorageData. Вот как я пытался это сделать:

beforeEach(() => {
  fixture = TestBed.createComponent(MyComponent);
  component = fixture.componentInstance;
})

it('should create', async(()=> {
   var spy = spyOn(component, "getStorageData").and.callThrough();
   fixture.detectChanges();
   expect(component).toBeDefined();
   expect(component.getStorageData).toHaveBeenCalled();
}))

Последняя строка теста всегда не проходит тест. Что я делаю не так?

1 Ответ

0 голосов
/ 16 января 2020

Причина, по которой он не был вызван, заключается в том, что метод spyOn вызывается после создания компонента, то есть после вызова конструктора. Есть несколько способов обойти это:

  1. Переместите вызов функции на ngOnInit hook:
export class MyComponent {
  constructor() {}

  ngOnInit(): void {
    this.getStorageData();
  }

  getStorageData() {...}
}

И вы просто убедитесь, что вы вызываете spyOn до вашего первого detectChanges(). Тогда вы можете оставить тест, как он у вас


Просто инициализируйте компонент, используя new и добавьте шпиона к прототипу:
it('should call getStorageData', function() {
  spyOn(MyComponent.prototype, 'getStorageData').and.callThrough();
  const component = new MyComponent();
  expect(MyComponent.prototype.getStorageData).toHaveBeenCalled();
});

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


Поместите шпиона в beforeEach на прототипе
beforeEach(() => {
  spyOn(MyComponent.prototype, 'getStorageData').and.callThrough();
  fixture = TestBed.createComponent(MyComponent);
  component = fixture.componentInstance;
})

it('should create', async(()=> {   
   fixture.detectChanges();
   expect(component).toBeDefined();
   expect(MyComponent.prototype.getStorageData).toHaveBeenCalled();
}))

Вы, вероятно, должны рассмотреть возможность изоляции этого теста, чтобы убедиться, что он не шпионит за каждым тестом в этой игре c .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...