2016-09-15 240 views
0

我正在使用AngularFire2。運行測試時我得到了這個異常。沒有AngularFire的提供商

這是我的測試是什麼樣子:

import {inject, TestBed} from '@angular/core/testing'; 
import {FIREBASE_PROVIDERS, defaultFirebase, AngularFire} from 'angularfire2'; 

describe('stock data service',() => { 
    beforeAll(() => { 
     const config = { 
      apiKey: "123", 
      authDomain: "123.firebaseapp.com", 
      databaseURL: "https://123.firebaseio.com", 
      storageBucket: "123.appspot.com", 
     }; 
     TestBed.configureTestingModule({ 
      providers: [FIREBASE_PROVIDERS, defaultFirebase(config)] 
     }); 
    }); 

    it('should connect to Firebase', inject([AngularFire], (af : AngularFire) => { 
     expect(af.database).not.toBe(null); 
    })); 

}); 

我想這AngularFire不能注入,因爲它是一個功能?

回答

1

用'beforeEach'代替'beforeAll'解決了這個問題。

但有人可以解釋爲什麼這個改變使它的工作?

這裏是我發現:

我可以看到額外的供應商被添加到全球測試牀configureTestingModule被調用後。但是,如果beforeAll在稍後調用TestBed.execute(tokens: any[], fn: Function)時會以某種方式丟失這些額外的提供程序,從而無法通過依賴注入器找到這些提供程序。

+1

Angular [配置'beforeEach'調用](https://github.com/angular/angular/blob/2.0.0/modules/%40angular/core/testing/testing.ts#L23-L28)重置'TestBed'。這就是爲什麼'TestBed.configureTestingModule'調用需要在beforeEach中進行的原因 - 在測試之前,你的'beforeAll'和'TestBed'被調用後,Angular的'beforeEach'被調用。 – cartant