无法使用实习生对依赖于 dojo 1.x 的模块运行单元测试
Posted
技术标签:
【中文标题】无法使用实习生对依赖于 dojo 1.x 的模块运行单元测试【英文标题】:Cannot run unit tests on modules with dependencies on dojo 1.x using the Intern 【发布时间】:2015-05-29 15:23:04 【问题描述】:我们刚刚开始在我们基于 dojo 的项目中在实习生中运行一些单元测试。
当实习生尝试加载被测模块的依赖项时,会发生以下错误:
/<path/to/dev/folder>/app/node_modules/intern/node_modules/dojo/dojo.js:406
match = mid.match(/^(.+?)\!(.*)$/);
^
TypeError: Cannot read property 'match' of null at getModule (/<path/to/dev/folder>/app/node_modules/intern/node_modules/dojo/dojo.js:406:15) at mix.amd.vendor (/<path/to/dev/folder>/app/node_modules/intern/node_modules/dojo/dojo.js:832:17) at /<path/to/dev/folder>/app/src/simplebuilding/model/ModelError.js:10:1
at exports.runInThisContext (vm.js:74:17)
at Object.vm.runInThisContext (/<path/to/dev/folder>/app/node_modules/intern/node_modules/istanbul/lib/hook.js:163:16)
at /<path/to/dev/folder>/app/node_modules/intern/node_modules/dojo/dojo.js:762:8
at fs.js:334:14
at FSReqWrap.oncomplete (fs.js:95:15)
这是我的配置文件 - 我首先复制示例文件,然后将地图部分添加到加载器。
define(
proxyPort: 9000,
proxyUrl: 'http://localhost:9000/',
capabilities:
'selenium-version': '2.41.0'
,
browserName: 'chrome', version: '40', platform: [ 'OS X' ]
],
maxConcurrency: 3,
tunnel: 'NullTunnel',
loader:
// Packages that should be registered with the loader in each testing environment
packages: [
name: 'dojo', location: 'src/dojo' ,
name: 'dojox', location: 'src/dojox' ,
name: 'dijit', location: 'src/dijit' ,
name: 'app', location: 'src/app' ,
name: 'tests', location: 'tests'
],
map:
'*':
'dojo' : 'dojo'
,
app :
'dojo' : 'dojo'
,
intern :
'dojo' : 'node_modules/intern/node_modules/dojo'
,
'tests' :
'dojo' : 'dojo'
,
suites: [ 'tests/model/modelerror' ],
functionalSuites: [ /* 'myPackage/tests/functional' */ ],
excludeInstrumentation: /^(?:tests|test\-explore|node_modules)\//
);
被测文件依赖于dojo/_base/declare、dojo/_base/lang和dojo/Stateful,仅此而已。
我创建了一个虚拟类来测试没有 dojo 依赖的地方,它运行良好。
我尝试将加载器切换为我们项目中的本地 dojo 1.10.3 版本,这会引发完全不同的错误,即无法找到实习生(即使我在配置)。这些错误如下所示:
[Error: ENOENT, no such file or directory '/<path/to/dev/folder>/app/node_modules/.bin/main.js']
errno: -2,
code: 'ENOENT',
path: '/<path/to/dev/folder>/app/node_modules/.bin/main.js',
syscall: 'open'
我们的项目结构非常简单:
root
|--src
|--dojo (dijit/dojox/dgrid/etc)
|--app
|--tests
|--intern.js (config file)
除了更改加载程序之外,我还尝试了几种变体,例如尝试确保基本路径正确。我试过在节点 0.10.36 和 0.12.2 中运行它。但是每次我使用 node-inspector 调试它时,它会为我的被测文件加载模块并且中间为空,然后跳回堆栈跟踪它看起来不错,但是 vm.runInThisContext() 中丢失了一些东西调用,并且在调用 getModule() 时中间消失了。
感谢任何帮助 - 谢谢!
【问题讨论】:
【参考方案1】:所以我想通了——我们在项目中加载了使用旧样式的 define() 函数的模块。我们已经从旧的 define('my.module.namespace', ['deps'], function(deps) ... );
转移到将第一个参数中模块的点命名空间替换为 null。我们将其作为完全消除该论点的过渡阶段,但尚未完成该过渡。这导致 dojo2 加载器认为模块的“id”为空,从而导致加载器找不到模块 ID。
这对我们来说是一个完全愚蠢的错误,这将有助于我们现代化,以适应未来道场准备的更新签名。
【讨论】:
以上是关于无法使用实习生对依赖于 dojo 1.x 的模块运行单元测试的主要内容,如果未能解决你的问题,请参考以下文章
实习生 4 无法将 Dojo Loader 与 ArcGIS JavaScript API 一起使用