2017-04-03 139 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);