测试 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');
});
});
您的代码有两个问题。
setAttributeName
向订阅者发送值,而 getAttributeName
监听可观察对象。因此,当您调用 setAttributeName
时,getAttributeName
会发出一个值,但没有任何内容订阅它。所以你应该先订阅 getAttributeName
然后调用 setAttributeName
发出值。
- 现在将执行期望,但由于数据传递不正确,测试将失败。
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' });
});
我有一个私人 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');
});
});
您的代码有两个问题。
setAttributeName
向订阅者发送值,而getAttributeName
监听可观察对象。因此,当您调用setAttributeName
时,getAttributeName
会发出一个值,但没有任何内容订阅它。所以你应该先订阅getAttributeName
然后调用setAttributeName
发出值。- 现在将执行期望,但由于数据传递不正确,测试将失败。
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' });
});