" TypeError:deps.map不是函数"在node_modules / dojo / dojo.js的resolveDepMaps()中

时间:2015-03-27 21:40:58

标签: dojo intern

我一直在改变我的组织底层基础设施,以便使用单独的Web服务器在浏览器客户端中运行自动化测试,以及在测试运行器(intern-runner)中运行。在测试运行环境中,事情一直在膨胀 - 我已经过了很多问题,但随后出现了繁荣!有人丢弃了一个新的unittest,它在浏览器客户端运行得很好,但是当我用test runner运行它时,我得到了这个错误:

! TypeError:deps.map不是http://9.77.140.51:9000/__intern/node_modules/dojo/dojo.js:678

的函数

dojo.js中的第678行是:

resolveDeps = function (deps, module, referenceModule) {
    // resolve deps with respect to this module
    return deps.map(function (dep, i) {   // <-- Line 678!
        var result = getModule(dep, referenceModule);
        if (result.fix) {
            result.fix = function (m) {
                module.deps[i] = m;
            };
        }
        return result;
    });
},

我根本没有改变过这个文件。我不知道resolveDeps()函数是做什么的,或者是什么“deps”。

我没有看到这个新测试正在做的事情有什么不寻常,没有什么真正特别的数百个其他测试通过就好(但是,我没有写它)。浏览器客户端报告没有错误当使用测试运行器运行时,调出开发人员工具来查看控制台没有提供有意义的信息,因为TypeError似乎终止了HTTP代理服务器而浏览器控制台只显示了一堆404,这似乎是红色的鲱鱼,因为服务器停了。

任何人都有线索吗?

2 个答案:

答案 0 :(得分:1)

这很可能是由于测试模块格式不正确,但没有更多信息很难说。错误发生在加载器的依赖项解析代码中,该代码对definerequire语句起作用。 Dojo的define函数理解4个参数配置:

  1. define(id, deps, callback)
  2. define(deps, callback)
  3. define(callback)
  4. define(object)
  5. id是一个字符串,deps是一个数组。)如果由于某种原因你有一个使用格式为define(id, callback)的模块,你会得到错误你是因为加载器中的依赖项解析代码要求第一个或第二个参数是一个数组。

答案 1 :(得分:0)

这似乎是由dojo.js

引起的

这使测试的模块加载路径与非测试文件略有不同。

node_modules / dojo / dojo.js

  if (has('host-browser')) {
injectUrl = function (url, callback, module, parent) {
    // insert a script element to the insert-point element with src=url;
    // apply callback upon detecting the script has loaded.
    var node = document.createElement('script'),
        handler = function (event) {
            document.head.removeChild(node);

            if (event.type === 'load') {
                has('loader-ie9-compat') ? callback(node) : callback();
            }

当Dojo设置define全局调用时,它会检查传递给define调用的参数数量。因此,如果您传递单个对象进行定义,类似于 nls 正在为i18n文件执行的操作,它将触及以下逻辑。

<强> node_modules /道场/的dojo.js:844

var define = mix(function (deps, factory) {
    if (has('loader-explicit-mid') && arguments.length === 3) {
        var id = deps;
        deps = factory;
        factory = arguments[2];
        var module = getModule(id);
        module.injected = true;
        defineModule(module, deps, factory);
    }

    if (arguments.length === 1) {
        if (has('loader-cjs-wrapping') && typeof deps === 'function') {
            factory = deps;
            deps = [ 'require', 'exports', 'module' ];

            // Scan factory for require() calls and add them to the
            // list of dependencies
            factory.toString()
                .replace(comments, '')
                .replace(requireCall, function () {
                    deps.push(/* mid */ arguments[2]);
                });
        }
        else if (/* define(value) */ !Array.isArray(deps)) {
            var value = deps;
            deps = [];
            factory = function () {
                return value;
            };
        }
    }

    if (has('loader-ie9-compat')) {
        for (var i = document.scripts.length - 1, script; (script = document.scripts[i]); --i) {
            if (script.readyState === 'interactive') {
                script.defArgs = [ deps, factory ];
                break;
            }
        }
    }
    else {
        defArgs = [ deps, factory ];
    }
}, {
    amd: { vendor: 'dojotoolkit.org' }
});

这定义如果它不是函数,那么它将进入第二次检查以查看依赖项是否不是数组,然后设置结构以在工厂中返回值。