2015-08-21 4 views
0

Я использую 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 терпит неудачу, поскольку код работает отлично, когда я запускаю его в браузере.

EDIT: Я думаю, что совершил ошибку. var MY_APP_ = MY_APP || {};, похоже, никогда не работает, если MY_APP не определен, поэтому единственным вариантом является объявление MY_APP перед использованием math.js

+1

Кажется, вы предоставляя свой собственный ответ: «Когда я создаю приложение, этот app.js включен перед math.js» _. Другими словами, 'math.js' зависит от' app.js'. – robertklep

+0

Да, но требование app.js в тесте не решает проблему. – Jarzka

ответ

0

От того, что вы показали, я думаю, что вы получите сообщение об ошибке, и ваш прямой тест будет работать.

В вашем тесте вы инициализируете MY_APP пустым объектом, который позволяет ему запускать. Но в вашем math.js файл MY_APP никогда не инициализируется, поэтому, когда вы устанавливаете var MY_APP = MY_APP, он никогда не сможет его установить.

Я бы предложил попробовать инициализировать MY_APP, прежде чем назначать его как значение для переменной.

0

С единственной целью app.js просто инициализировать var MY_APP = {}; глобального масштаба я решил сделать то же самое в тестовом файле, так:

var assert = require("assert"); 
global.MY_APP = {}; 
var math = require("../../js/utils/math.js"); 

решает проблему

Смежные вопросы