У меня есть угловой компонент, MyComponent , который вызывает метод, возвращающий Observable, и подписывается на него, что-то вроде
export class MyComponent {
someProperty;
constructor(service: MyService) {}
someButtonClicked() {
this.service.doStuffAsync().subscribe(
resp => this.someProperty = resp;
);
}
}
@Injectable()
export MyService {
doStuffAsync() {
// returns an Observable which notifies asychronously, e.g. like HttoClient.get(url)
}
}
Я хочу протестировать метод someButtonClicked()
ипоэтому я создаю класс MyServiceMock , который добавляю в тесте
export class MyServiceMock {
doStuffAsync() {
return of({// some object}).pipe(observeOn(asyncScheduler));
}
}
По какой-то причине я хочу, чтобы doStuffAsync()
из MyServiceMock был асинхронным, поэтому observeOn(asyncScheduler)
На данный момент, хотя я не знаю, как проверить someButtonClicked()
. Я пробовал разные стратегии, например, следующую
beforeEach(async(() => {
TestBed.configureTestingModule({
providers: [
{ provide: MyService, useClass: MyServiceMock },
]
}).compileComponents();
}));
let fixture: ComponentFixture<MyComponent>;
let component: MyComponent;
beforeEach(() => {
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('test someButtonClicked', async(() => {
component.someButtonClicked();
fixture.whenStable().then(() => {
expect(component.someProperty).toBeDefined();
});
}));
, но это не помогло, поскольку doStuffAsync()
из MyServiceMock асинхронный.
Так что мой вопрос - какая стратегия самая лучшаяпроверить побочные эффекты (т. е. someProperty
устанавливаются правильно), вызванные методом, который подписывается на асинхронную наблюдаемую.