测试带有订阅的打字稿功能

时间:2018-08-23 15:25:20

标签: angular typescript testing jasmine karma-jasmine

因此,我正在使用Jasmine / Karma进行测试,并且正在使用Angular4。我正在尝试测试如下所示的函数:

enter image description here

如您所见,this.name分配没有被触及。我试过用以下方法进行测试:

it('should make sure name is set', () => {
  component.retrievePageInfo();
  expect(component.name).toBeDefined();
});

,但目前尚不确定。我不确定如何等待它完成。 我也尝试过:

it('should make sure name is set', () => {
  component.retrievePageInfo().subscribe(art => {
    expect(component.name).toBe(art["name"]);
  });
});

但是我收到错误消息“类型'void'上不存在属性'subscribe'”。但是,如果我将功能更改为:

retrievePageInfo() {
  return this.httpClient.get("/api/art/" + this.art_id)
  .subscribe(art => {
    this.name = art['name'];
  });
}

我收到错误消息“订阅”类型上不存在属性“订阅”。但我需要在这里订阅。

请帮助!

编辑:一个大概的例子会很好,因为我似乎无法正确理解。我目前正在尝试将其拆分为一个函数,该函数返回一个可观察的函数,另一个函数使用该函数,但是我的测试仍然没有捕获到它

编辑:这是我最新的尝试: 我已经导入了fakeAsync并打勾

it('should set name value', fakeAsync(() => {
    expect(component.name).toBeUndefined();
    spyOn(component, "retrievePageInfo");
    component.retrievePageInfo();
    tick();
    fixture.detectChanges();
    expect(component.name).toBeDefined();
}));

但是我仍然遇到“未定义的预期未定义”错误。

1 个答案:

答案 0 :(得分:1)

您需要查看异步单元测试:

 it('#getObservableValue should return value from observable',
    (done: DoneFn) => {
    service.getObservableValue().subscribe(value => {
      expect(value).toBe('observable value');
      done();
    });
  });

上面的代码来自文档:https://angular.io/guide/testing#service-tests