无法使用实习生对依赖于 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 一起使用

如何将 Intern 添加到 Dojo 项目中?

无法使用 RequireJs 加载 Dojo 模块

运行实习生测试时加载dojo补丁文件

依赖于 Yii2 中 JavaScript 代码块的 JavaScript 文件(用于 dojo 配置)

类似于 dojo DOH 的 Javascript 测试框架