我使用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(测试中的代码)?
答案 0 :(得分:0)
好的,我已经成功解决了这个问题。
分配实际上存在于现有的生产代码中,我之前没想过要查看“ .html”文件。当我在“ .js”文件中找不到它时,我认为还有其他事情发生了。
因为我把线放在错误的位置,因此将线放在测试脚本中的原因并不重要。该错误实际上发生在配置时,而不是在执行测试本身时,因此赋值必须在“requirejs.config()”调用之前。现在测试工作,无需修改CUT。