【发布时间】:2018-08-30 07:54:58
【问题描述】:
我有一个仅使用主题的 Angular 服务,但我不确定如何为其编写单元测试。
我看到了 [this thread][1],但我觉得它没有太大帮助。
我试图模拟next(),但我有点迷失了。
【问题讨论】:
标签: javascript angular typescript testing karma-runner
我有一个仅使用主题的 Angular 服务,但我不确定如何为其编写单元测试。
我看到了 [this thread][1],但我觉得它没有太大帮助。
我试图模拟next(),但我有点迷失了。
【问题讨论】:
标签: javascript angular typescript testing karma-runner
您应该监视service.serviceMsg 而不是service,因为next() 方法似乎在serviceMsg 主题上。
it('should catch what is emitted', () => {
const nextSpy = spyOn(service.serviceMsg, 'next');
service.confirm(ACTION);
expect(nextSpy).toHaveBeenCalled();
});
编辑:
您还应该更改创建service 实例的方式。您在代码中显示的内容仅适用于 component 实例创建
beforeEach(() => {
TestBed.configureTestingModule({
providers: [MessageService]
});
service = TestBed.get(MessageService); // get service instance
httpMock = TestBed.get(HttpTestingController);
});
【讨论】:
Error: Illegal state: Could not load the summary for directive MessageService.
fixture = TestBed.createComponent(MessageService); service = fixture.componentInstance; 这样创建service 实例。这仅适用于组件。相反,您应该这样做 service = TestBed.get(MessageService)
首先,您可以订阅您的 Subject 并在里面期望一些值,然后执行将发出该值的方法:
it('should catch what is emitted', () => {
service.serviceMsg.subscribe(msg => {
expect(msg).toEqual(something);
});
service.confirm(value); // this should match what you expect above
});
【讨论】:
Subject的实现,这不是单元测试应该做的。你应该像他试图做的那样嘲笑它。
Subject实现。