【问题标题】:How to use TheIntern with Webpack and Babel如何将 TheIntern 与 Webpack 和 Babel 一起使用
【发布时间】:2018-07-19 08:40:14
【问题描述】:

我尝试使用theintern 进行单元/功能测试,但我使用 webpack 捆绑/加载模块,使用 webpack-dev-server 进行本地开发,使用 babel 进行 JS 转换。

当我尝试加载组件时,我的组件中通过导入导入的文件出现错误。

// a.js
const getWindowLocation = window.location
export default getWindowLocation

// b.js
import getWindowLocation from "a.js"
const anotherVar = getWindowLocation
// make some work with anotherVar
export default anotherVar

// c.js
import anotherVar from "b.js"
// module i try to test
const something = somevalue
export default something

然后在我的测试文件中:

// test.c.js
import something from "c.js"

但是,当我加载我的测试套件时,出现如下错误:

ReferenceError: window is not defined
at getWindowLocation  <a.js>
at Object.<anonymous>  <b.js>

我使用 jsdom 启用 window,它适用于 c.js,但不适用于其他模块。

那么,如何配置实习生在没有 SystemJS 和 Typescript 的情况下处理来自 webpack 的模块?

【问题讨论】:

  • 你能把你的项目(或示例项目)贴在某个地方吗? window 错误表明某处可能存在配置问题。如果你还没有的话,你也可以看看实习生webpack example
  • 感谢您的回答!我将尝试举一个例子。我已经看过 webpack 的示例,但是它使用 webpack 来构建它的测试文件,而不是 Webpack Entry point 项目的那些。本地文件在index.html中用下划线和主干处理
  • 嗨,我做了这个小例子:github.com/ethyde/test-theintern-webpack

标签: webpack intern


【解决方案1】:

问题在于c.js 假定window 在全局范围内。虽然createwindow.js 创建了一个 jsdom 窗口,但它不会将其添加到全局范围内。

一种解决方案是将jsdom的window添加到全局范围:

// createwindow.js
const jsdom = require('jsdom')
const { JSDOM } = jsdom
const { window } = new JSDOM()
global.window = window;

然而,正如 jsdom 作者所指出的,这个isn't a good practice。相反,您的测试类应该使用您的createWindow 插件来获取window

// c.js
const window = intern.getPlugin('createWindow');
const getWindowLocation = window.location
export default getWindowLocation

【讨论】:

  • 我在我的测试文件中进行了更改:github.com/ethyde/test-theintern-webpack/blob/master/tests/unit/…,是的,它可以工作,但是,所以我不能再使用import() 了吗?
  • 您可以使用import(如果您有要导入的内容可以提供window 参考)或getPlugin。问题在于您没有在 c.js 中获得对 window 的引用。
  • 我接受了答案,因为它确实有效,但我不确定是否正确理解它。在您的示例中:*第一个有效,但这是一种不好的做法,并且似乎Run code before tests start 之类的选项或插件在这种情况下不是很有用? *第二个建议在生产文件中使用intern?我是单元测试的初学者,我试图理解好的方法。感谢您的帮助。
  • 啊,我不明白c.js 是生产。你绝对不应该在那里使用实习生。 :) 无论如何,核心问题仍然是您在 Node.js 中运行浏览器代码。 Jsdom 是一种方法。将 jsdom 窗口添加到全局命名空间是使用 jsdom 的一种方式。这不是理想,因为您基于浏览器的代码将在一个奇怪的环境中运行(Node 的全局空间包含浏览器没有的属性),因此您最终可能会得到通过测试但获胜的代码不能在真正的浏览器中工作。但是,这是目前在 Intern 中使用 jsdom 最简单的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2016-02-04
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
相关资源
最近更新 更多