我正在尝试为角度服务编写测试,该服务具有Subject属性和在该主题上调用.next()的方法.
该服务如下:
@Injectable() export class SubjectService { serviceSubjectProperty$: Subject<any> = new Subject(); callNextOnSubject(data: any) { this.serviceSubjectProperty$.next(data); } }
以及该服务的测试文件:
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'); }) })); });
如果我将subjectService.callNextOnSubject的参数从’test’更改为其他任何内容,则测试总是传递事件.
我也尝试用async和fakeAsync包装所有内容,但结果是一样的.
测试callNextOnSubject是否向serviceSubjectProperty $Subject发送数据的正确方法是什么?
解决方法
我在搜索解决方案时发现了这篇文章:
http://www.syntaxsuccess.com/viewarticle/unit-testing-eventemitter-in-angular-2.0
它对我来说效果很好(它很短,不要害怕打开它).
我在这里粘贴它,所以它可能会帮助那些来到这个网站寻找答案的人.
关于提出的问题 – 我认为你需要改变:
subjectService.callNextOnSubject('test'); subjectServiceProperty$.subscribe((message) => { expect(message).toBe('test'); })
至
subjectServiceProperty$.subscribe((message) => { expect(message).toBe('test'); }) subjectService.callNextOnSubject('test');
,所以先订阅,然后发出一个事件.
如果您在订阅之前发出’test’,那么什么都不会“捕获”该事件.