2016-09-15 187 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