使用依赖项测试服务

时间:2020-04-07 12:41:13

标签: angular typescript testing testbed

我正在尝试使用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属性位于存根上,而不是真正的服务上。但是当我在提供程序中将其列为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之后现在还没有公开? 我查看了文档,但是找不到有关依赖项的测试服务的良好示例。如果有人能帮助我并指出正确的方向,我将不胜感激。 谢谢。

0 个答案:

没有答案