我们的项目结构如下:Angular2-webpack-starter.
我们的项目成功编译,构建并可在浏览器中看到.这里没问题.
但是当我们尝试运行测试用例时,karma and jasmine
我们会收到此错误.
XXXXComponent :heavy_multiplication_x: Should Match Current Tab as 1 Chrome 55.0.2883 (Mac OS X 10.10.5) Error: Unexpected value 'FormGroup' declared by the module 'DynamicTestModule' at SyntaxError.ZoneAwareError (webpack:///~/zone.js/dist/zone.js:811:0 <- config/spec-bundle.js:74048:33) at SyntaxError.BaseError [as constructor] (webpack:///~/@angular/compiler/src/facade/errors.js:26:0 <- config/spec-bundle.js:78913:16) at new SyntaxError (webpack:///~/@angular/compiler/src/util.js:151:0 <- config/spec-bundle.js:6408:16) at webpack:///~/@angular/compiler/src/metadata_resolver.js:475:0 <- config/spec-bundle.js:19829:40 at Array.forEach (native) at CompileMetadataResolver.getNgModuleMetadata (webpack:///~/@angular/compiler/src/metadata_resolver.js:457:0 <- config/spec-bundle.js:19811:54) at JitCompiler._loadModules (webpack:///~/@angular/compiler/src/jit/compiler.js:165:25 <- config/spec-bundle.js:55462:64) at JitCompiler._compileModuleAndAllComponents (webpack:///~/@angular/compiler/src/jit/compiler.js:144:25 <- config/spec-bundle.js:55441:52) at JitCompiler.compileModuleAndAllComponentsSync (webpack:///~/@angular/compiler/src/jit/compiler.js:98:0 <- config/spec-bundle.js:55395:21) at TestingCompilerImpl.compileModuleAndAllComponentsSync (webpack:///~/@angular/compiler/bundles/compiler-testing.umd.js:482:0 <- config/spec-bundle.js:78583:35) at TestBed._initIfNeeded (webpack:///~/@angular/core/bundles/core-testing.umd.js:761:0 <- config/spec-bundle.js:26731:40) at TestBed.createComponent (webpack:///~/@angular/core/bundles/core-testing.umd.js:844:0 <- config/spec-bundle.js:26814:18) at Function.TestBed.createComponent (webpack:///~/@angular/core/bundles/core-testing.umd.js:673:0 <- config/spec-bundle.js:26643:33) at Object.(webpack:///src/app/zzzz/yyyy/xxxx.component.spec.ts:20:0 <- config/spec-bundle.js:93231:37) at ZoneDelegate.invoke (webpack:///~/zone.js/dist/zone.js:242:0 <- config/spec-bundle.js:73479:26) at ProxyZoneSpec.onInvoke (webpack:///~/zone.js/dist/proxy.js:79:0 <- config/spec-bundle.js:73133:39) at ZoneDelegate.invoke (webpack:///~/zone.js/dist/zone.js:241:0 <- config/spec-bundle.js:73478:32) at Zone.run (webpack:///~/zone.js/dist/zone.js:113:0 <- config/spec-bundle.js:73350:43) at Object. (webpack:///~/zone.js/dist/jasmine-patch.js:102:0 <- config/spec-bundle.js:72848:34) at ZoneQueueRunner.jasmine.QueueRunner.ZoneQueueRunner.execute (webpack:///~/zone.js/dist/jasmine-patch.js:132:0 <- config/spec-bundle.js:72878:42) at ZoneQueueRunner.jasmine.QueueRunner.ZoneQueueRunner.execute (webpack:///~/zone.js/dist/jasmine-patch.js:132:0 <- config/spec-bundle.js:72878:42) at webpack:///~/zone.js/dist/jasmine-patch.js:129:91 <- config/spec-bundle.js:72875:130 at ZoneDelegate.invokeTask (webpack:///~/zone.js/dist/zone.js:275:0 <- config/spec-bundle.js:73512:35) at Zone.runTask (webpack:///~/zone.js/dist/zone.js:151:0 <- config/spec-bundle.js:73388:47) at drainMicroTaskQueue (webpack:///~/zone.js/dist/zone.js:433:0 <- config/spec-bundle.js:73670:35)
我们已根据新的角度约定在app.module.ts中导入了所有这些模块.
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; @NgModule({ bootstrap: [ AppComponent ], declarations: [ ... ], imports: [ // import Angular's modules ... BrowserModule, FormsModule, HttpModule, ReactiveFormsModule, ... ], providers: [ // expose our Services and Providers into Angular's dependency injection ENV_PROVIDERS, APP_PROVIDERS ], schemas: [ CUSTOM_ELEMENTS_SCHEMA ] }) export class AppModule { constructor() {} }
我们的testBed就是以这种方式设置的
TestBed.configureTestingModule({ imports: [ReactiveFormsModule, FormsModule], declarations: [ FormGroup, XXXXComponent ], // declare the test component }); fixture = TestBed.createComponent(XXXXComponent); comp = fixture.componentInstance; });
并且
testing.TestBed.initTestEnvironment( browser.BrowserDynamicTestingModule, browser.platformBrowserDynamicTesting() );
我们安装了所有最新版本的软件包.
"@angular/common": "~2.4.3", "@angular/compiler": "~2.4.3", "@angular/core": "~2.4.3", "@angular/forms": "~2.4.3", "@angular/http": "~2.4.3", "@angular/material": "2.0.0-beta.1", "@angular/platform-browser": "~2.4.3", "@angular/platform-browser-dynamic": "~2.4.3", "@angular/platform-server": "~2.4.3", "@angular/router": "~3.4.3", "karma": "^1.2.0", "karma-chrome-launcher": "^2.0.0", "karma-coverage": "^1.1.1", "karma-jasmine": "^1.0.2", "karma-remap-coverage": "^0.1.4", "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "2.0.1", "webpack": "2.2.0", "webpack-dev-middleware": "^1.9.0", "webpack-dev-server": "2.2.0", "webpack-dll-bundles-plugin": "^1.0.0-beta.5", "webpack-md5-hash": "~0.0.5", "webpack-merge": "~2.4.0"
任何帮助解决这个问题的人都表示赞赏.
错误发生在您的测试台配置中
TestBed.configureTestingModule({ imports: [ReactiveFormsModule, FormsModule], declarations: [ FormGroup, XXXXComponent ], // declare the test component });
FormGroup
不属于您的代码,它属于您的代码,因此您无权ReactiveFormsModule
声明它.声明意味着NgModule对所声明的所有权的所有权.您也不应该提供,导入或直接导出它.您可以通过导入方式间接导入ReactiveFormsModule
,也可以通过导出方式间接导出ReactiveFormsModule
.你不能声明它.你不能提供它.
所以将配置调用更改为
TestBed.configureTestingModule({ imports: [ReactiveFormsModule, FormsModule], declarations: [XXXXComponent], // declare the test component });