首页 > 解决方案 > 测试具有依赖关系的服务

问题描述

我正在尝试使用 TestBed 为我的服务设置测试。该服务具有其他服务的一些依赖关系。我为这些依赖项创建了 .stub 文件并将它们导出。问题是当我尝试在测试中使用这些存根时,测试方法似乎仍然使用真正的服务而不是测试。这是我的设置(假名仅用于此线程):

describe('ServiceToTest', () => {
    let stubbedService: ServiceDependency1;

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [],
            providers: [
                ServiceToTest,
                { provide: ServiceDependency1, useClass: ServiceDependency1Stub },
                { provide: ServiceDependency2, useClass: ServiceDependency2Stub }
            ]
        });

        stubbedService = TestBed.inject(ServiceDependency1);
    });

    it('description', fakeAsync(() => {
        // Error appears here when trying to use the BehaviorSubject on the mock:
        // Property 'behaviorSubjectTest' does not exist on type                 
       'ServiceDependency1'
        stubbedService.behaviorSubjectTest.next(new Test());
        ... more logic
    }));
});

我理解这个错误,那是因为behaviorSubjectTest属性在存根上,而不是真正的服务。但是,当我在提供程序中将它列为 a 时,它为什么不使用存根服务useClass呢?

我究竟做错了什么?当我看到可用的内容时,serviceDependency1Stub我看到的是真实服务上的所有方法和属性,而不是存根。这发生在更新到 Angular 9 之后。之前我们使用了该.get方法,然后它就起作用了。然后它是这样设置的:

describe('ServiceToTest', () => {
    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [],
            providers: [
                ServiceToTest,
                { provide: ServiceDependency1, useClass: ServiceDependency1Stub },
                { provide: ServiceDependency2, useClass: ServiceDependency2Stub }
            ]
        });
    });

    it('description', fakeAsync(() => {
        const stubbedService = TestBed.get(ServiceDependency1);
        stubbedService.behaviorSubjectTest.next(new Test());
        ... more logic
    }));
});

这是 .stub 文件:

export class ServiceDependency1Stub {
    public behaviorSubjectTest = new BehaviorSubject<Test>(null);
}

我猜从一开始的设置是错误的,但在更改为.inject? 我查看了文档,但找不到任何关于测试具有依赖项的服务的好例子。如果有人可以帮助我并指出正确的方向,我将不胜感激。谢谢。

标签: angulartypescripttestingtestbed

解决方案


推荐阅读