我使用mocha来测试文件中的函数。可测试函数的实现如下:
math.js
(function (exports) {
var MY_APP_ = MY_APP || {};
MY_APP_.utils = MY_APP_.utils || {};
MY_APP_.utils.math = MY_APP_.utils.math || {};
MY_APP_.utils.math.randomValue = function (min, max) {
return Math.floor(Math.random() * (max + 1 - min) + min);
};
exports.math = MY_APP_.utils.math;
})(this);
这是测试: 的 math_test.js
var assert = require("assert");
var math = require("../../js/utils/math.js");
describe('Math', function() {
describe('randomValue', function () {
it('should return random values', function () {
// Fill array with random values between 0 and 10
var values = [];
for (var i = 0; i < 10000; i++) {
values.push(math.math.randomValue(0, 10));
}
// Count numbers
var result = {};
values.forEach(function(number) {
var numberAsString = number.toString();
result[numberAsString] = result[numberAsString] + 1 || 1;
});
// There must be at least two of each number
assert.equal(Object.keys(result).length, 11);
Object.keys(result).forEach(function(key) {
assert.equal(true, result[key] > 1);
});
});
});
});
问题是var MY_APP_ = MY_APP || {};
失败并显示错误消息:未定义MY_APP。
当然,MY_APP未在此测试范围内定义,因为它在另一个名为app.js的文件中定义。当我构建应用程序时,这个app.js文件包含在math.js之前,并且它们都连接成一个production.js文件。这没有问题。
但是,如果我用以下内容替换失败的行,则测试有效:
var MY_APP = {};
if (typeof(MY_APP) !== 'undefined') {
MY_APP_ = MY_APP;
} else {
MY_APP_ = {};
}
在我看来,这看起来很愚蠢。我想知道mocha失败的原因,因为当我在浏览器中运行代码时代码运行得非常好。
编辑:
我想我犯了一个错误。如果没有定义MY_APP,var MY_APP_ = MY_APP || {};
似乎永远不会工作,所以唯一的选择是在使用math.js之前声明MY_APP
答案 0 :(得分:0)
根据您展示的内容,我认为您会收到错误,并且您的直接测试有效。
在测试中,您将MY_APP
初始化为允许其运行的空对象。但是在math.js
文件MY_APP
中永远不会初始化,因此当您设置var MY_APP = MY_APP
时,它永远无法将其设置为任何内容。
我建议尝试初始化MY_APP
,然后再将其指定为变量的值。
答案 1 :(得分:0)
由于app.js的唯一目的是将var MY_APP = {};
初始化为全局范围,因此我决定在测试文件中执行相同操作,因此:
var assert = require("assert");
global.MY_APP = {};
var math = require("../../js/utils/math.js");
解决问题