测试RxJS主题:测试中未调用subscribe方法

时间:2019-11-01 19:42:58

标签: angular unit-testing jasmine observable angular-test

我有一个私人Subject attributeNameSubject 。有一个 setAttributeName 方法,该方法将字符串值传递给主题。我们使用 getAttributeName 来引用该主题。我正在尝试测试上面的代码,但是我总是得到 false-positive ,即测试通过了,但是我得到了 test没有期望警告。事实证明,它根本没有调用subscribe方法。

我正在Angular 7中测试此代码。

private readonly attributeNameSubject = new Subject<string>();

get getAttributeName(): Subject<string> {
  return this.attributeNameSubject;
}

setAttributeName(value: any) {
  this.getAttributeName.next(value.attributeName);
}

it('should set attribute name on valid input', () => {
  service = TestBed.get(AttributeService);

  service.setAttributeName('some random string');
  service.getAttributeName.subscribe((data: string) => {
    expect(data).toEqual('some random string');
  });
});

1 个答案:

答案 0 :(得分:2)

您的代码有两个问题。

  1. setAttributeName将值发送给订阅者,而getAttributeName则监听可观察的对象。因此,当您调用setAttributeName时,getAttributeName会发出一个值,但没有预订。因此,您应该首先订阅getAttributeName,然后调用setAttributeName发出该值。
  2. 现在将执行期望,但是由于数据传递不正确,测试将失败。您刚传递字符串时,getAttributeName发出value.attributeName。您需要改为传递一个对象。

这是有效的测试用例。

it('should set attribute name on valid input', () => {
    service = TestBed.get(AttributeService);

    service.getAttributeName.subscribe((data: string) => {
        expect(data).toEqual('some random string');
    });
    service.setAttributeName({ attributeName: 'some random string' });
});