Это потому, что вы запрашиваете кнопку до того, как она появится.Просто переместите fixture.detectChanges()
до element.querySelectorAll()
, и оно должно работать.См. Angular Docs , чтобы узнать, почему.
it('should call myMethod', fakeAsync(() => {
spyOn(comp, 'myMethod').and.callThrough();
fixture.detectChanges(); // <--- Move to here from below ...
element.querySelectorAll('button')[0].click();
// fixture.detectChanges(); <-- Move this ...
expect(comp.myMethod).toHaveBeenCalled();
// fixture.whenStable().then(async(() => {
// fixture.detectChanges();
// }));
}));
Работает StackBlitz .Проверьте консоль, как я изменил myMethod()
следующим образом:
myMethod() {
console.log(this.myData); // is no longer undefined here
}
Надеюсь, это поможет.
Обновление
Я изменил StackBlitz, чтобы сделать это болееЧисто.Вот новые тесты в StackBlitz:
it('comp.myData should be undefined if element.query is first', () => {
element.querySelectorAll('button')[0].click();
expect(comp.myData).toBeUndefined(); // <-- Note this is UNDEFINED at this point
fixture.detectChanges(); // <--- This is in the wrong place ...
});
it('comp.myData should be defined if fixture.detectChanges() is first', () => {
fixture.detectChanges(); // <--- Now this is in the before the query.
element.querySelectorAll('button')[0].click();
expect(comp.myData).toEqual({data: 'test'}); // <-- Note this is now defined
});
Если вы загляните в файл console.log, вы увидите следующее:
Console was cleared
undefined
{data: "test"}
Первый неопределенный из первого теста,когда fixture.detectChanges()
находится не в том месте.Второй {data: "test"}
взят из второго теста, где он теперь определен.
Надеюсь, это поможет.