测试 RxJS Subject:subscribe 方法在测试中没有被调用

Testing a RxJS Subject: subscribe method not getting called in the test

我有一个私人 Subject attributeNameSubject。有一个 setAttributeName 方法将字符串值传递给主题。我们使用 getAttributeName 获取对该主题的引用。我正在尝试测试上面的代码,但我总是得到 false-positive,即测试通过但我得到 test has no expectation 警告。原来它根本没有调用 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. 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' });
});