angular - 您如何在 ngOnInit 生命周期中测试可观察对象?

标签 angular unit-testing jasmine angular2-observables

我看过很多关于测试可观察对象的文章,包括 writing marble tests不知何故,我仍然找不到关于如何在我的 ngOnInit 周期中测试组件中的简单可观察对象的直接答案。

ngOnInit(): void {
    this.selectedMembers$.subscribe((members) => {
        if (!!members) {
            this.store.dispatch(actions.getPCPs());
        }
    });

    this.membersForm.valueChanges.subscribe((id) => {
        if (!!id.member_id) {
            if (id.member_id === 'null') {
                this.store.dispatch(actions.getMembers());

                return;
            }
            this.store.dispatch(
                actions.getSelectedMember({ member_id: id.member_id }),
            );
        }
    });

    this.config$.subscribe((config) => {
        if (!!config) {
            config.mobile_filters.controls.forEach((control) => {
                this.formControlService.addControlToFormGroup(
                    this.mobileFiltersForm,
                    control,
                );
            });
        }
    });
}

有没有一种直接的方法可以监视此组件并检查这些可观察对象是否正在发射某些东西?

 it('should test observables in ngOnInit', fakeAsync(() => {
    spyOn(component.selectedMembers$, 'subscribe')
    let myData;
    component.selectedMembers$.subscribe((data) => {
        myData = data;
        console.log('data',data);
        expect(myData).toEqual(data);
    })
}));

最佳答案

你到底想测试什么?

如果您只想在测试完成之前调用订阅回调,您可以在测试中使用 tick() 方法 (https://angular.io/api/core/testing/tick):

it('should dispatch if members are provided / selected', fakeAsync(() => {
  // arrange
  const dispatchSpy = spyOn(component.store, 'dispatch');
  const membersToEmit = ['member-1', 'member-2'];
  component.selectedMembers$ = of(membersToEmit) // of from 'rxjs';

  // act
  component.ngOnInit();
  // alternatively you could call:
  // fixture.detectChanges();

  tick();  // causes your Observable to emit, so that the subscribe callback gets called 

  // assert
  expect(dispatchSpy).toHaveBeenCalled();
}));

关于angular - 您如何在 ngOnInit 生命周期中测试可观察对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63608276/

相关文章:

javascript - 如何描述具有动态名称的 typescript 类型?

javascript - 使用 Jasmine 和 TypeScript 进行单元测试

java - 是否可以只运行一个测试类(利用 PowerMock 和 Mockito)?

integration-testing - 使用 jasmine 测试 ember.js 应用程序

unit-testing - 用 Jasmine 伪造 FormData 附加

Angular 4.3 HttpClient 不发送授权 header

angular - 我有时会在 Azure DevOps "Error: Cannot find module ' symbol-observable 中收到这样的错误'"

angular - 如何在 Angular 4.0 中使用 Angular 2 Universal

c# - Xunit () 中的测试异常

node.js - 我怎样才能让 Istanbul 尔与 Node 、 Mocha 、 Jasmine 一起工作并需要 js