javascript - Angular CLI "ng e2e": missing localStorage in protractor tests with ts-node

标签 javascript angular protractor angular-cli typescript2.0

我有一个基于 ngrx 并使用 @angular/cli: 1.0.0-beta.32.3 构建的 Angular2 项目。 该应用程序本身与官方支持的示例 ngrx 应用程序有很多共同点:https://github.com/ngrx/example-app .

我使用 https://github.com/btroncone/ngrx-store-localstorage 将商店的某些部分与 localStorage 同步包,所以:

在我的 reducers/index.ts 文件中(看起来像原来的 https://github.com/ngrx/example-app/blob/master/src/app/reducers/index.ts )代替原来的:

const developmentReducer: ActionReducer<State> = compose(
  storeFreeze,
  combineReducers
)(reducers);

const productionReducer: ActionReducer<State> = combineReducers(reducers);

我有稍微修改过的版本:

const developmentReducer: ActionReducer<State> = compose(
  storeFreeze,
  localStorageSync(['auth'], true),
  combineReducers
)(reducers);

const productionReducer: ActionReducer<State> = compose(
  localStorageSync(['auth'], true),
  combineReducers
)(reducers);

它工作得很好,完全没有问题。

问题是我无法使用此设置运行 Protractor 端到端测试。此 localStorageSync 将浏览器的 localStorage 作为默认参数。但是,angular-cli 的 Protractor 使用 ts-node,如 protractor.conf.js 中所述:

beforeLaunch: function() {
  require('ts-node').register({
    project: 'e2e'
  });
},

ng e2e 以错误结束:

[19:25:07] I/direct - Using ChromeDriver directly...
[19:25:09] E/launcher - Error: ReferenceError: localStorage is not defined
    at Object.exports.localStorageSync (/home/myfolder/e2e-storage-test/node_modules/ngrx-store-localstorage/src/index.ts:118:77)
    at Object.<anonymous> (/home/myfolder/e2e-storage-test/src/app/reducers/index.ts:32:3)
    at Module._compile (module.js:570:32)
    at Module.m._compile (/home/myfolder/e2e-storage-test/node_modules/ts-node/src/index.ts:406:23)
    at Module._extensions..js (module.js:579:10)
    at Object.require.extensions.(anonymous function) [as .ts] (/home/myfolder/e2e-storage-test/node_modules/ts-node/src/index.ts:409:12)

此处提供完整的追溯:https://gist.github.com/radoslawroszkowiak/17e53b9043264b6d813df2374e8d4dc8 .

我想避免弄乱像 node-localstorage 这样的东西,因为我不希望这个项目用于服务器端渲染,只用于浏览器环境。

如何解决这个问题?

最佳答案

正如人们所预料的那样,这个原因被证明是非常愚蠢的。

在其中一个 e2e 测试文件中,有一个从应用程序的路由模块导入的路径名。这样就造成了导入链,包括路由模块中导入的组件等。

由于端到端测试文件是使用 ts-node 执行的,而不是在浏览器上下文中执行的,所以一旦编译器遇到 localStorage 事件就会抛出错误。

在 e2e 规范文件中删除有问题的导入解决了这个问题。

我的结论是:在 e2e 模块中从您的应用导入任何内容时要小心。

关于javascript - Angular CLI "ng e2e": missing localStorage in protractor tests with ts-node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42351920/

相关文章:

javascript - 如何将所需的元素绑定(bind)到一个div中?

angular - 来自 chokidar 的错误(C :\): Error: EBUSY: resource busy or locked, lstat 'C :\DumpStack. log.tmp

angular - 在模板中,我如何绑定(bind)到由 observable 传递的对象的深层嵌套属性?

angular - 运行 docker build 时 Npm run build 失败

javascript - Protractor 适合规范 DRY

angularjs - Protractor browser.get() 在 IE11 中抛出异常

javascript - IE 在此脚本中发现的错误在哪里?

javascript - 如何使用 javascript 中的 nomerge 选项打开 IE8 窗口

javascript - 在 javascript 中返回函数,理解作用域和闭包

angularjs - 使用单个 Gulp 任务运行 Protractor