测试链依赖服务

Test chain depended services

我想测试一些服务 AService,它有一些依赖 BService,它依赖于另一个服务 e.x。 C服务。我们有链状依赖关系:

A服务 --> B服务 --> C服务

一个服务构造函数:

constructor(
  private bService: BService
) {}

B服务构造函数:

constructor(
   private cService: CService
) {}

如果我想在我的测试文件中测试 AService,我应该这样写:

beforeAll(() => {
      injector = ReflectiveInjector.resolveAndCreate([
            AService,
            BService,
            CService,
        ]);

        service = injector.get(AService);
   });

如果我有太多相互链接的服务,我会得到太多样板文件。

有没有办法不在我的 AService 测试文件中注入所有链式服务?

理想情况下,在对代码进行单元测试时不应包含实际依赖项。相反,您应该提供一个模拟 serviceB 并存根这些依赖项。

    describe('AService', () => {
       beforeAll(() => {
          injector = ReflectiveInjector.resolveAndCreate([
              AService,
              {provide: BService, useClass: MockBService}
              ]);
          Aservice = injector.get(AService);
       });
    });


    class MockBService {
      // enter mock functions here that you want to invoke from Service A
      // this does not have dependency on Service C
    }

在您的测试中,您可以监视对服务 B 的调用和 return 您想要的任何值。

   const BService = AService.injector.get(BService);
   spyOn(BService, 'someFunc').and.returnValue(1);