Javascript 角度-单元测试主题()?

Javascript 角度-单元测试主题()?,javascript,angular,typescript,testing,karma-runner,Javascript,Angular,Typescript,Testing,Karma Runner,我有一个角度服务,只使用一个主题,但我不确定如何为它编写单元测试 我看到了[这条线索][1],但我觉得它没有太大帮助 我试图模仿next(),但我有点迷路了。你应该监视service.servicemg而不是service,因为next()方法似乎在servicemg主题上 it('should catch what is emitted', () => { const nextSpy = spyOn(service.serviceMsg, 'next'); service

我有一个角度服务,只使用一个主题,但我不确定如何为它编写单元测试

我看到了[这条线索][1],但我觉得它没有太大帮助


我试图模仿
next()
,但我有点迷路了。

你应该监视
service.servicemg
而不是
service
,因为
next()
方法似乎在
servicemg
主题上

it('should catch what is emitted', () => {
    const nextSpy = spyOn(service.serviceMsg, 'next');
    service.confirm(ACTION);
    expect(nextSpy).toHaveBeenCalled();
});
编辑:

您还应该更改创建
服务
实例的方式。您在代码中显示的内容仅适用于
组件
实例创建

beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [MessageService]
    });
    service = TestBed.get(MessageService); // get service instance
    httpMock = TestBed.get(HttpTestingController);
});

首先,您可以订阅您的
主题
,并在内部期望一些值,然后执行方法,该方法将发出:

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
的实现,而这不是单元测试应该做的。我相信这不是单元测试,因为它包括创建模块或注入之类的内容。确实,它将依赖于
主题
实现。我明白你的意思。尽管我收到了错误:
错误:非法状态:无法加载指令MessageService的摘要。
@trichetriche-您是否了解此问题?您无法创建
服务
实例,如
fixture=TestBed.createComponent(MessageService);服务=fixture.componentInstance。这仅适用于组件。相反,你应该做
service=TestBed.get(MessageService)
啊,太棒了!谢谢你的帮助@Amit:-)@physicsboy如果你想通知我,必须是我已经评论过的问题/答案,否则我不会收到通知!