Как проверить при передаче переменной в javascript iffe

Как протестировать следующий iife javascript в Jasmine, если я хочу смоделировать передаваемый параметр y? Поскольку ссылки на файлы сценариев указываются перед сценарием спецификаций, y вызывается немедленно, прежде чем я смогу издеваться/подглядывать за объектом y.

Я могу создать фиктивный фиктивный объект в html-файле spec runner (или даже в другом файле js), но это не позволяет мне изменять фиктивное значение в каждом тесте, так как я не могу ссылаться на переменную checkObject, поэтому я не могу протестировать сценарий «пройдено/не пройдено». Я что-то упускаю?

Спасибо

файл 1.js

var y =  {
   age:25
} 

файл 2.js

var helper = (function(checkObject){
  function isValid(itemToCheck){
    return itemToCheck > checkObject.age ;   
  }
   return {isValid:isValid}
})(y);

person phooey    schedule 16.04.2015    source источник


Ответы (1)


Я вижу, что ты пытаешься сделать. Я думаю, вы должны изменить свой код. Когда часть кода не тестируется, это намек на плохой дизайн. iife в основном используется для создания новой лексической области видимости для защиты от загрязнения глобальной области видимости. В вашем случае вы используете iife в качестве фабрики объектов. Одним из решений может быть создание вспомогательной фабрики, которая принимает checkObject и возвращает вспомогательный объект.

var helperFactory = {}; 

helperFactory.createHelper = function (checkObject){

      function isValid(itemToCheck){
         return itemToCheck > checkObject.age ;   
      }

      return {isValid:isValid}; // this is the helper object returned by the factory
  }

Теперь вы можете протестировать helperFactory и вспомогательный объект. Чтобы использовать переменную y, вы можете просто сделать что-то вроде этого:

var helper = helperFactory.createHelper(y);

помните, iife в основном используется для сокрытия переменных (создания новой области видимости). Если вы хотите скрыть helperFactory, вы должны использовать какой-то механизм, чтобы сделать этот объект видимым в глобальной области видимости. вы можете, например, прикрепить helperFactory к глобальному объекту окна следующим образом:

(function(){
    window.helperFactory = {}; 
    window.helperFactory.createHelper = function (checkObject){

        function isValid(itemToCheck){
            return itemToCheck > checkObject.age ;   
        }

        return {isValid:isValid}; // this is the helper object returned by the factory
    }
})();
var helper = window.helperFactory.createHelper(y);
person Mostafa EL BARRAK    schedule 16.04.2015
comment
Привет, спасибо за ответ. Это был очень простой пример, но я думаю, что вы правы насчет рефакторинга кода. Чем больше я смотрю на это, тем больше я думаю, что у меня должна быть функция для установки/получения параметров или настроек. Немного похоже на объект параметров виджета jquery ui. [ссылка]api.jqueryui.com/jquery.widget - person phooey; 17.04.2015