Unit testing Karma Jasmine-代码覆盖范围不覆盖Observable';s订阅方法

Unit testing Karma Jasmine-代码覆盖范围不覆盖Observable';s订阅方法,unit-testing,karma-jasmine,code-coverage,angular10,Unit Testing,Karma Jasmine,Code Coverage,Angular10,我正在对angular 10项目中的组件方法之一进行单元测试 我看到了这个代码: MessageListComponent.ts describe('MessageListComponent', () => { let fixture: ComponentFixture<MessageListComponent>; let component: MessageListComponent; let messageService: MessageServic

我正在对angular 10项目中的组件方法之一进行单元测试

我看到了这个代码:

MessageListComponent.ts

describe('MessageListComponent', () => {
    let fixture: ComponentFixture<MessageListComponent>;
    let component: MessageListComponent;
    let messageService: MessageService;
    beforeEach(() => {
        // TestBed configuration
        TestBed.configureTestingModule({
            ....
            providers: [
                MessageService,
                ....
            ]
        }).compileComponents();
    });

    beforeEach(() => {
        messageService = TestBed.inject(MessageService);
        messageService.getAllContents = jasmine.createSpy().and.returnValue(observableOf(<any[]>[{}]));
        fixture = TestBed.createComponent(MessageListComponent);
        component = fixture.componentInstance;
        fixture.detectChanges();
    });

    it('should load', () => {
        expect(messageService.getAllContents).toHaveBeenCalled();
    });
});
    
编辑:更新完整的代码(答案已经在这篇文章的评论中)

我创建了一个等级库文件,如下所示:

MessageListComponent.spec.ts

describe('MessageListComponent', () => {
    let fixture: ComponentFixture<MessageListComponent>;
    let component: MessageListComponent;
    let messageService: MessageService;
    beforeEach(() => {
        // TestBed configuration
        TestBed.configureTestingModule({
            ....
            providers: [
                MessageService,
                ....
            ]
        }).compileComponents();
    });

    beforeEach(() => {
        messageService = TestBed.inject(MessageService);
        messageService.getAllContents = jasmine.createSpy().and.returnValue(observableOf(<any[]>[{}]));
        fixture = TestBed.createComponent(MessageListComponent);
        component = fixture.componentInstance;
        fixture.detectChanges();
    });

    it('should load', () => {
        expect(messageService.getAllContents).toHaveBeenCalled();
    });
});
    
description('MessageListComponent',()=>{
let夹具:组件夹具;
let组件:MessageListComponent;
let messageService:messageService;
在每个之前(()=>{
//试验台配置
TestBed.configureTestingModule({
....
供应商:[
消息服务,
....
]
}).compileComponents();
});
在每个之前(()=>{
messageService=TestBed.inject(messageService);
messageService.getAllContents=jasmine.createSpy()和.returnValue(observeof([{}]);
fixture=TestBed.createComponent(MessageListComponent);
组件=fixture.componentInstance;
fixture.detectChanges();
});
它('应该加载',()=>{
expect(messageService.getAllContents).toHaveBeenCalled();
});
});
当我运行ng测试时——代码覆盖率=true

覆盖范围在
MessageListComponent
GetAllContents
方法中得到了实现,但是订阅方法中的函数没有被覆盖范围覆盖


在subscribe方法中获取函数是否缺少一些内容?

您需要测试subscribe块的
//这里有更多的代码
,很抱歉回复太晚。在同事的帮助下,我解决了这个问题。他发现服务也被注入@Component注释的
提供者
属性中。删除这些代码使我的代码覆盖率发挥了作用:)顺便说一句,感谢您提供帮助,您需要测试订阅块的
//此处的进一步代码
。很抱歉回复太晚。在同事的帮助下,我解决了这个问题。他发现服务也被注入@Component注释的
提供者
属性中。删除这些使我的代码覆盖率工作:)顺便说一句,谢谢你的帮助