2017-04-03 137 views
0

我想测试一些服务AService,它有一些依赖BService,依赖于另一个服务e.x.内部CService。我们有像连锁的依赖关系:测试链依赖服务

AService - > BService - >内部CService

AService构造:

constructor(
    private bService: BService 
) {} 

BService构造:

constructor(
    private cService: CService 
) {} 

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

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

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

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

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

回答

1

理想情况下,单元测试代码时不应包含实际的依赖关系。相反,你应该提供一个模拟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,并返回任何你想要的值。

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