crd*_*deu 6 testing subject jasmine rxjs angular
我正在尝试为角度服务编写测试,该服务具有Subject属性和调用.next()该主题的方法.
该服务如下:
@Injectable()
export class SubjectService {
serviceSubjectProperty$: Subject<any> = new Subject();
callNextOnSubject(data: any) {
this.serviceSubjectProperty$.next(data);
}
}
Run Code Online (Sandbox Code Playgroud)
以及该服务的测试文件:
import { TestBed, inject } from '@angular/core/testing';
import { SubjectService } from './subject.service';
describe('SubjectService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
SubjectService
]
});
});
it('callNextOnSubject() should emit data to serviceSubjectProperty$ Subject',
inject([SubjectService], (subjectService) => {
subjectService.callNextOnSubject('test');
subjectServiceProperty$.subscribe((message) => {
expect(message).toBe('test');
})
}));
});
Run Code Online (Sandbox Code Playgroud)
如果我将subjectService.callNextOnSubjectfrom 的参数更改'test'为其他任何内容,则测试始终会传递事件.
我也尝试用async和包装所有东西fakeAsync,但结果是一样的.
测试是否callNextOnSubject向serviceSubjectProperty$主题发送数据的正确方法是什么?
我在搜索解决方案时发现了这篇文章:
http://www.syntaxsuccess.com/viewarticle/unit-testing-eventemitter-in-angular-2.0
它对我来说效果很好(它很短,不要害怕打开它).
我在这里粘贴它,所以它可能会帮助那些来到这个网站寻找答案的人.
关于提出的问题 - 我认为你需要改变:
subjectService.callNextOnSubject('test');
subjectServiceProperty$.subscribe((message) => {
expect(message).toBe('test');
})
Run Code Online (Sandbox Code Playgroud)
至
subjectServiceProperty$.subscribe((message) => {
expect(message).toBe('test');
})
subjectService.callNextOnSubject('test');
Run Code Online (Sandbox Code Playgroud)
,所以先订阅,然后发出一个事件.
如果您'test'在订阅之前发出,那么什么都不会"捕获"该事件.
| 归档时间: |
|
| 查看次数: |
10720 次 |
| 最近记录: |