&引用;ReferenceError:未定义系统";使用带有Angular2和.ts规格的量角器时

&引用;ReferenceError:未定义系统";使用带有Angular2和.ts规格的量角器时,angular,typescript,protractor,e2e-testing,Angular,Typescript,Protractor,E2e Testing,我想用Angular2在hello world应用程序上进行e2e测试,测试规格用typescript编写。但是,量角器崩溃时显示以下消息: Using the selenium server at http://localhost:4444/wd/hub [launcher] Running 1 instances of WebDriver [launcher] Error: ReferenceError: System is not defined at Object.<ano

我想用Angular2在hello world应用程序上进行e2e测试,测试规格用typescript编写。但是,量角器崩溃时显示以下消息:

Using the selenium server at http://localhost:4444/wd/hub
[launcher] Running 1 instances of WebDriver
[launcher] Error: ReferenceError: System is not defined
    at Object.<anonymous> (C:\Dev\d2ipm\test\e2e\overview.js:1:1)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Module.require (module.js:367:17)
    at require (internal/module.js:16:19)
    at C:\Users\%username%\AppData\Roaming\npm\node_modules\protractor\node_modules\jasmine\lib\jasmine.js:63:5
    at Array.forEach (native)
    at Jasmine.loadSpecs (C:\Users\%username%\AppData\Roaming\npm\node_modules\protractor\node_modules\jasmine\lib\jasmine.js:62:18)
[launcher] Process exited with error code 100

运行用纯JS编写的测试效果很好。如何使我的测试环境看到系统?

当您通过量角器运行e2e测试时,实际上有两个环境:

  • 首先是正在测试的环境
    • 它在浏览器中运行
    • 所述浏览器通过“Selenium Webdriver”自动化系统进行控制
    • 它像最终使用的浏览器一样加载和执行整个应用程序,包括加载index.html文件
  • 第二个是运行测试本身的环境
    • 在中作为本地node.js应用程序运行
    • 它使用运行Jasmine的量角器,Jasmine运行e2e测试文件
    • 它通过Selenium控制浏览器
即使在index.html文件中加载库,e2e规范文件也无法访问它们。这包括systemjs。当Typescript编译器使用
“模块”:“系统”

如何修复它? 一种解决方案是配置构建过程,以便使用
“module”:“commonjs”
选项编译e2e规范文件。如果您希望能够将文件从web应用程序导入测试规范,则必须编译整个应用程序两次(尽管我不确定有多少用例这样做是有意义的)

例如,使用“大口喝”

const gulpTypings = require('gulp-typings')
const sourcemaps = require('gulp-sourcemaps')
const ts = require('gulp-typescript')

const tsProject = ts.createProject('tsconfig.json')
const tsProjectE2E = ts.createProject('tsconfig-e2e.json')

const tsFiles = [
  'typings/index.d.ts',
  'app/**/*.ts',
  '!**/*.e2e-spec.ts',
  '!node_modules/**/*'
]

const tsFilesE2E = [
  'typings/index.d.ts',
  'app/**/*.e2e-spec.ts',
  'app/**/*.ts', // You should not need that unless you use your app files in your tests
  '!node_modules/**/*'
]

gulp.task('typings', () => gulp
  .src('./typings.json')
  .pipe(gulpTypings())
)

gulp.task('ts', ['typings'], () => gulp
  .src(tsFiles)
  .pipe(sourcemaps.init())
  .pipe(ts(tsProject))
  .js
  .pipe(sourcemaps.write('.'))
  .pipe(gulp.dest('app'))
)

gulp.task('ts-e2e', ['typings'], () => gulp
  .src(tsFilesE2E)
  .pipe(sourcemaps.init())
  .pipe(ts(tsProjectE2E))
  .js
  .pipe(sourcemaps.write('.'))
  .pipe(gulp.dest('e2e')) // Note that your compiled tests files are put in the e2e/ folder now
)

在测试教程中,他们使用CommonJS而不是System。他们使用Jasmine,因为我所看到的量角器不能用于Angular 2,是吗?@Langley测试教程涉及单元测试,而不是e2e。量角器也用茉莉花。Angular2在存储库中配置了量角器,因此他们似乎不会在2.0版中使用它。我知道它使用Jasmine,但它是为Angular1构建的,我还没有为Angular2找到它。@Langley您建议如何使用Angular2?好吧,我相信量角器是在Selenium之上构建的,所以可能可以实现这一点。我,我将等待他们制作一个新的量角器。如何配置他们的构建过程,以便使用
module:commonjs
编译e2e规范,并使用
module:system
编译其余的typescript文件?在上面显示的gulp配置中,您将看到有两个不同的tsconfig.json文件。您应该将第一个(tsconfig.json)配置为
“模块”:“系统”
,将第二个(tsconfig-e2e.json)配置为
“模块”:“commonjs”
const gulpTypings = require('gulp-typings')
const sourcemaps = require('gulp-sourcemaps')
const ts = require('gulp-typescript')

const tsProject = ts.createProject('tsconfig.json')
const tsProjectE2E = ts.createProject('tsconfig-e2e.json')

const tsFiles = [
  'typings/index.d.ts',
  'app/**/*.ts',
  '!**/*.e2e-spec.ts',
  '!node_modules/**/*'
]

const tsFilesE2E = [
  'typings/index.d.ts',
  'app/**/*.e2e-spec.ts',
  'app/**/*.ts', // You should not need that unless you use your app files in your tests
  '!node_modules/**/*'
]

gulp.task('typings', () => gulp
  .src('./typings.json')
  .pipe(gulpTypings())
)

gulp.task('ts', ['typings'], () => gulp
  .src(tsFiles)
  .pipe(sourcemaps.init())
  .pipe(ts(tsProject))
  .js
  .pipe(sourcemaps.write('.'))
  .pipe(gulp.dest('app'))
)

gulp.task('ts-e2e', ['typings'], () => gulp
  .src(tsFilesE2E)
  .pipe(sourcemaps.init())
  .pipe(ts(tsProjectE2E))
  .js
  .pipe(sourcemaps.write('.'))
  .pipe(gulp.dest('e2e')) // Note that your compiled tests files are put in the e2e/ folder now
)