0

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

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

Data.Daily = new Function();
Data.Daily.prototype = {

需要明确的是,这段代码每天都在生产环境中运行,并且在所有主流浏览器(FF、IE 和 Chrome)中都可以正常运行。

测试看起来像这样:

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”是如何工作的,有什么奇怪的地方可以做到这一点吗?为什么通过在测试中添加行而不是 CUT(被测代码)无法进行测试?

4

1 回答 1

0

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

该分配实际上存在于现有的生产代码中,我只是没想过在“ .html”文件中查找它。当我在“.js”文件中没有找到它时,我以为发生了其他事情。

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

于 2013-08-14T18:04:32.253 回答