2

我正在尝试为我的项目(Dojo/JS 项目)设置实习生,并且服务器不是 Node... 我遇到了加载程序问题,这似乎是由于 dojo.has 使用 Dojo 加载程序... require 包装器在这里建议对我不起作用。

我收到以下错误:

> node node_modules/intern/client.js config=tests/intern
Defaulting to "console" reporter
dojo/text plugin failed to load because loader does not support getText
TypeError: undefined is not a function
at Object.load (lib/dojo/dojo/text.js:199:6)

以下是我的实习生配置和测试文件:

/tests/intern.js:(配置文件)

loader: {
    packages: [ { name: 'visitorsPortal', location: 'portals/visitor' },
        { name: 'dojo', location: 'lib/dojo/dojo'},
        { name: 'dijit', location: 'lib/dojo/dijit'},               
        { name: 'portalLib', location: 'portals/lib'} ]
},
suites: [ 'tests/uitests' ],

测试/测试:

define([
    'intern!tdd',
    'intern/chai!assert',
    'portals/visitor/views/MyModule'
 ], function (test, assert, MyModule) {

     // empty for now...

 });
4

2 回答 2

3

这与需要在服务器端使用时仅存在于 Dojo 1 加载器中的功能的插件无关,也与dojo/has插件无关。dojo/text

如果您尝试测试依赖于任何非标准 AMD 加载程序功能的软件,您将需要使用非标准加载程序,或使用与其他加载程序兼容的替代副本覆盖这些模块。

在这种特定情况下,最简单的方法是使用 Geezer 版本的 Intern,因为它包含旧的 Dojo 加载器,其中包含这些非标准扩展。最好的前进路径是将dojo/text模块重新映射到另一个不需要加载器中任何特殊内容以检索数据的兼容模块:

// in intern.js
// ...
loader: {
  map: {
    '*': {
      'dojo/text': 'my/text'
    }
  }
},
// ...
于 2013-09-20T06:17:10.747 回答
1

昨天我遇到了同样的问题,但感谢 C Snover 在这里的回答和你链接到的问题,我确实取得了一些进展。

我将该map指令添加到 intern.js 加载程序配置中(正如 C Snover 建议的那样)。

    // in intern.js
    // ...
    loader: {
      map: {
        '*': {
          'dojo/text': 'my/text'
        }
      }
    },
    // ...

对于my/text模块,我只是复制dojo/text并添加了一个 else if 子句到解析 getText 函数的部分:

if(has("host-browser")){
    getText= function(url, sync, load){
        request(url, {sync:!!sync}).then(load);
    };
} else if(has("host-node")){      
    // This was my addition...
    getText = function(url, sync, load) {
        require(["dojo/node!fs"], function(fs) {
            fs.readFile(url, 'utf-8', function(err, data) {
                if(err) console.error("Failed to read file", url);
                load(data);
            });
        });
    };
} else {
      // Path for node.js and rhino, to load from local file system.
      // TODO: use node.js native methods rather than depending on a require.getText() method to exist.
      if(require.getText){

          getText= require.getText;

      }else{
          console.error("dojo/text plugin failed to load because loader does not support getText");
      }
  }

但是,即使测试是通过节点在实习生中运行的,host-node也没有设置值。这是通过dojo-has-api在我的 intern.js 配置中设置来解决的:

define(["intern/node_modules/dojo/has"], function(has) {

    has.add("dojo-has-api", true);

    return { /* my intern config as normal */ };
});

我承认我不能 100% 理解我在这里所做的事情,并且通过复制/粘贴它并不完全漂亮,但它至少可以临时解决我的问题。

注意:这确实引入了另一组问题:由于 Dojo 现在知道它在节点中运行,所以 dojo/request 不再尝试使用 XHR。我正在使用 sinon.js 来模拟我的 xhr 请求,所以必须改变它。

于 2013-10-03T13:10:19.447 回答