有些奇怪的javascript代码在所有主流浏览器中都能工作,但在phantomjs/qunit中失败

有些奇怪的javascript代码在所有主流浏览器中都能工作,但在phantomjs/qunit中失败,javascript,requirejs,phantomjs,qunit,jstestrunner,Javascript,Requirejs,Phantomjs,Qunit,Jstestrunner,我在一个带有javascript/html前端和后端REST服务的应用程序上工作。我主要在后端服务上工作,但我正在尝试将javascript单元测试添加到构建中。我让人帮助我设置javascript测试框架,使用phantomjs、qunit和jstestrunner,所有这些都是从Maven引用的 我为一个模块(我们称之为“data.daily.js”)编写了一个简单的单元测试,其开头如下: Data.Daily = new Function(); Data.Daily.prototype =

我在一个带有javascript/html前端和后端REST服务的应用程序上工作。我主要在后端服务上工作,但我正在尝试将javascript单元测试添加到构建中。我让人帮助我设置javascript测试框架,使用phantomjs、qunit和jstestrunner,所有这些都是从Maven引用的

我为一个模块(我们称之为“data.daily.js”)编写了一个简单的单元测试,其开头如下:

Data.Daily = new Function();
Data.Daily.prototype = {
requirejs.config({ shim: { 'data.daily': ['config'] } });
require(['data.daily'], function() {
    'use strict';
    module('data.daily');
    test('data.daily.test.initialize', function() {
        var dataDaily   = new Data.Daily();
        dataDaily.initialize(Config.AJAX_DAILY_DATA_BASE_URL, Config.MOCKDATA_AJAX_DAILY_DATA_BASE_URL);
        deepEqual(dataDaily.getData(), {}, "object is \"" + JSON.stringify(dataDaily.getData()) + "\", but it should be empty object");
    });
});
  ReferenceError: Can't find variable: Data, source: http://localhost:9080/data.daily.js:5
  [data.daily] data.daily.test.initialize: failed: 1 passed: 0
  Died on test #1     at http://localhost:9080/js/qunit.js:425
at http://localhost:9080/js/data.daily.test.js:17
at http://localhost:9080/js/require.js:1682
at http://localhost:9080/js/require.js:983
at http://localhost:9080/js/require.js:1194
at http://localhost:9080/js/require.js:129
at http://localhost:9080/js/require.js:1237
at each (http://localhost:9080/js/require.js:58)
at http://localhost:9080/js/require.js:1238
at http://localhost:9080/js/require.js:1043
at http://localhost:9080/js/require.js:1224
at http://localhost:9080/js/require.js:882
at callGetModule (http://localhost:9080/js/require.js:1249)
at http://localhost:9080/js/require.js:1578
at http://localhost:9080/js/require.js:1703: Can't find variable: Data, source: ReferenceError: Can't find variable: Data
需要明确的是,该代码每天都在生产环境中运行,并且在所有主要浏览器(FF、IE和Chrome)中都运行良好

测试如下所示:

Data.Daily = new Function();
Data.Daily.prototype = {
requirejs.config({ shim: { 'data.daily': ['config'] } });
require(['data.daily'], function() {
    'use strict';
    module('data.daily');
    test('data.daily.test.initialize', function() {
        var dataDaily   = new Data.Daily();
        dataDaily.initialize(Config.AJAX_DAILY_DATA_BASE_URL, Config.MOCKDATA_AJAX_DAILY_DATA_BASE_URL);
        deepEqual(dataDaily.getData(), {}, "object is \"" + JSON.stringify(dataDaily.getData()) + "\", but it should be empty object");
    });
});
  ReferenceError: Can't find variable: Data, source: http://localhost:9080/data.daily.js:5
  [data.daily] data.daily.test.initialize: failed: 1 passed: 0
  Died on test #1     at http://localhost:9080/js/qunit.js:425
at http://localhost:9080/js/data.daily.test.js:17
at http://localhost:9080/js/require.js:1682
at http://localhost:9080/js/require.js:983
at http://localhost:9080/js/require.js:1194
at http://localhost:9080/js/require.js:129
at http://localhost:9080/js/require.js:1237
at each (http://localhost:9080/js/require.js:58)
at http://localhost:9080/js/require.js:1238
at http://localhost:9080/js/require.js:1043
at http://localhost:9080/js/require.js:1224
at http://localhost:9080/js/require.js:882
at callGetModule (http://localhost:9080/js/require.js:1249)
at http://localhost:9080/js/require.js:1578
at http://localhost:9080/js/require.js:1703: Can't find variable: Data, source: ReferenceError: Can't find variable: Data
当我运行此测试时,它失败如下:

Data.Daily = new Function();
Data.Daily.prototype = {
requirejs.config({ shim: { 'data.daily': ['config'] } });
require(['data.daily'], function() {
    'use strict';
    module('data.daily');
    test('data.daily.test.initialize', function() {
        var dataDaily   = new Data.Daily();
        dataDaily.initialize(Config.AJAX_DAILY_DATA_BASE_URL, Config.MOCKDATA_AJAX_DAILY_DATA_BASE_URL);
        deepEqual(dataDaily.getData(), {}, "object is \"" + JSON.stringify(dataDaily.getData()) + "\", but it should be empty object");
    });
});
  ReferenceError: Can't find variable: Data, source: http://localhost:9080/data.daily.js:5
  [data.daily] data.daily.test.initialize: failed: 1 passed: 0
  Died on test #1     at http://localhost:9080/js/qunit.js:425
at http://localhost:9080/js/data.daily.test.js:17
at http://localhost:9080/js/require.js:1682
at http://localhost:9080/js/require.js:983
at http://localhost:9080/js/require.js:1194
at http://localhost:9080/js/require.js:129
at http://localhost:9080/js/require.js:1237
at each (http://localhost:9080/js/require.js:58)
at http://localhost:9080/js/require.js:1238
at http://localhost:9080/js/require.js:1043
at http://localhost:9080/js/require.js:1224
at http://localhost:9080/js/require.js:882
at callGetModule (http://localhost:9080/js/require.js:1249)
at http://localhost:9080/js/require.js:1578
at http://localhost:9080/js/require.js:1703: Can't find variable: Data, source: ReferenceError: Can't find variable: Data
我能找到的唯一方法是以这种方式更改“data.daily.js”,在现有行之前添加一行:

var Data    = {};
Data.Daily = new Function();
Data.Daily.prototype = {
现在我不得不说,这在我看来是合乎逻辑的,但事实是,现有的代码在所有主要浏览器中都能正常工作。此代码仅在从测试引用时才开始失败

请注意,我还尝试更改测试脚本,在“var dataDaily=new Data.Daily()”行之前添加“var Data={}”行,但没有效果


那么,有人能解释一下这里发生了什么吗?如果测试失败,为什么原始代码可以工作。“require.js”是如何工作的,这是不是有什么奇怪的地方导致了这种情况的发生?为什么测试没有通过在测试中添加行而不是剪切(测试中的代码)来工作呢?

好的,我已经设法解决了这个问题

这个任务实际上存在于现有的生产代码中,我只是以前没有想到要在“.html”文件中查找它。当我在“.js”文件中找不到它时,我以为发生了别的事情


将这一行放在测试脚本中不起作用的原因是我把这一行放错了位置。错误实际上发生在配置时,而不是在执行测试时,因此分配必须在“requirejs.config()”调用之前。现在测试可以工作了,而无需修改剪切。

在任何浏览器上下文中都可以工作的唯一方法是,如果代码位于创建名为“Data”的全局变量的其他代码之后。如果您不声明变量,然后尝试使用
运算符取消引用它,则始终会出现错误。是否有其他脚本加载到生产代码中,而测试中没有加载?正如@Pointy所指出的,必须有某种东西在创建
数据
全局,否则就会失败。我想说的是,我已经在整个代码库中搜索了对“数据”的引用,但没有找到它。然而,我刚刚意识到我只是在“*.js”文件中搜索了这个。我终于在“index.html”中找到了它。我现在至少明白了这一部分。然而,仍然不清楚的是,为什么我不能通过简单地在测试脚本本身中添加“var Data={}”行来让测试工作。