Mocha失败,变量未定义

时间:2015-08-21 18:50:07

标签: javascript mocha

我使用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

2 个答案:

答案 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");

解决问题