2016-11-20 74 views
2

在角2运行茉莉规范时,我得到这个错误的特性“喷油”:无法读取空茉莉花角2

无法读取空茉莉的特性“喷油”角2

堆栈跟踪:

TypeError: Cannot read property 'injector' of null 
    at TestBed._createCompilerAndModule (http://localhost:3002/node_modules/@angular/core/bundles/core-testing.umd.js:834:48) 
    at TestBed._initIfNeeded (http://localhost:3002/node_modules/@angular/core/bundles/core-testing.umd.js:800:43) 
    at TestBed.createComponent (http://localhost:3002/node_modules/@angular/core/bundles/core-testing.umd.js:884:18) 
    at Function.TestBed.createComponent (http://localhost:3002/node_modules/@angular/core/bundles/core-testing.umd.js:714:33) 
    at Object.eval (http://localhost:3002/js/app/landing-page/subcomponents/middle-row.component.spec.js:29:49) 
    at ZoneDelegate.invoke (http://localhost:3002/node_modules/zone.js/dist/zone.js:232:26) 
    at ProxyZoneSpec.onInvoke (http://localhost:3002/node_modules/zone.js/dist/proxy.js:79:39) 
    at ZoneDelegate.invoke (http://localhost:3002/node_modules/zone.js/dist/zone.js:231:32) 
    at Zone.run (http://localhost:3002/node_modules/zone.js/dist/zone.js:114:43) 
    at Object.eval (http://localhost:3002/node_modules/zone.js/dist/jasmine-patch.js:102:34) 

我从the official angular 2 testing docs复制该规范:

let comp: BannerComponent; 
let fixture: ComponentFixture<BannerComponent>; 
let de:  DebugElement; 
let el:  HTMLElement; 

describe('BannerComponent',() => { 
    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     declarations: [ BannerComponent ], // declare the test component 
    }); 

    fixture = TestBed.createComponent(BannerComponent); 

    comp = fixture.componentInstance; // BannerComponent test instance 

    // query for the title <h1> by CSS element selector 
    de = fixture.debugElement.query(By.css('h1')); 
    el = de.nativeElement; 

    }); 
}); 

,并适应它有一点点我的代码工作:

import 'zone.js/dist/long-stack-trace-zone.js'; 
import 'zone.js/dist/async-test.js'; 
import 'zone.js/dist/fake-async-test.js'; 
import 'zone.js/dist/sync-test.js'; 
import 'zone.js/dist/proxy.js'; 
import 'zone.js/dist/jasmine-patch.js'; 

import { ComponentFixture, TestBed } from '@angular/core/testing'; 
import { By } from '@angular/platform-browser'; 
import { DebugElement } from '@angular/core'; 

import { MiddleRowComponent } from './middle-row.component'; 

let comp: MiddleRowComponent; 
let fixture: ComponentFixture<MiddleRowComponent>; 
let de: DebugElement; 
let el: HTMLElement; 

describe('MiddleRowComponent',() => { 
    beforeEach(() => { 
     TestBed.configureTestingModule({ 
     declarations: [MiddleRowComponent], // declare the test component 
     }); 

     fixture = TestBed.createComponent(MiddleRowComponent); 

     comp = fixture.componentInstance; // MiddleRowComponent test instance 

     // query for the title <h1> by CSS element selector 
     de = fixture.debugElement.query(By.css('h1')); 
     el = de.nativeElement; 
    }); 

    it('should display original title',() => { 
     fixture.detectChanges(); 
     expect(el.textContent).toContain(comp.word); 
    }); 

    it('should display a different test title',() => { 
     comp.word = 'Test Title'; 
     fixture.detectChanges(); 
     expect(el.textContent).toContain('Test Title'); 
    }); 
}); 

为什么会出现错误?没有注入关键字,但我想TestBed可能会在幕后使用它。

回答

3

在某个时刻(在执行任何测试之前),您需要通过调用TestBed.initTestEnvironment(...)来初始化测试环境。

您通常会在karma-test-shim文件中看到此操作,如angular quickstart(与测试文档相同的快速入门)所示。但是如果你不使用这种技术,那么你需要在测试文件中做到这一点。但initTestEnvironment应该只被调用一次,所以你还需要在每个测试文件中重置它

import { BrowserDynamicTestingModule, 
     platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; 

beforeAll(() => { 
    TestBed.resetTestEnvironment(); 
    TestBed.initTestEnvironment(BrowserDynamicTestingModule, 
           platformBrowserDynamicTesting()); 
}); 
+0

谢谢。我现在只是遇到这个错误:'file:app/landing-page/subcomponents/middle-row.component.spec.ts' 严重程度:'错误' 消息:'参数类型'(extraProviders ?: Provider [ ])=> PlatformRef'不能分配给'PlatformRef'类型的参数。 Property'bootstrapModuleFactory'缺少类型'(extraProviders?:Provider [])=> PlatformRef'。' at:'26,34' source:'ts''我必须需要添加一些东西到我的应用程序的引导程序? 'platformBrowserDynamic()bootstrapModule(的AppModule);'? – BeniaminoBaggins

+0

对不起,第二个参数应该是_call_方法,而不仅仅是方法。我解决了它 –

+0

这可能是解决方案,我只是试图得到[另一个问题](http://stackoverflow.com/q/40700142/3935156)整理出来,以便我可以验证它的工作。我从@angular导入测试类时发生了一些奇怪的事情。谢谢。 – BeniaminoBaggins