Во многих структурах, внутренние переменные функции используются в качестве частных переменных, напримерДоступ к внутренней функции переменных в Javascript
Raphael = (function(){
var _private = function(a,b) {return a+b;};
var _public = function(a) {return _private(a,a);}
var object = {mult2:_public};
return object;
})();
здесь, мы не можем получить доступ из глобального пространства имен переменных с именем private
, так как это внутреннее переменная анонимной функции в первой строке.
Иногда эта функция содержит большую структуру Javascript, чтобы она не загрязняла глобальное пространство имен.
Мне нужно провести тестирование некоторых объектов Raphael
использует внутренне (в приведенном выше примере я хочу выполнить модульные тесты на объекте private
). Как я могу проверить их?
Редактировать: Я получил комментарии об модульных тестах, которые должны тестировать публичные интерфейсы.
Позвольте мне указать прецедент. Я пишу библиотеку под названием Raphael
. Предполагается, что эта библиотека добавляет только одно имя в глобальное пространство имен и не более того. Это своеобразное требование для Javascript, поскольку Javascript не имеет пространств имен.
Предположим, что Raphael
использует связанный список. Если Javascript имел представление пакетов, я бы
require 'linked_list'
Raphael = (function(){/* use linked list */})();
Однако Javascript не позволяет мне сделать это в любом случае, что бы не загрязнять глобальный масштаб с связанным объектом списка! Я поэтому обязан встраивать linked_list
в локальной области видимости Рафаэля:
Raphael = (function(){
/* implement linked list */
var linked_list = function(){/*implementation*/};
})();
А теперь я хочу проверить linked_list
реализацию.
идея unittests заключается в проверке только открытых функций/методов – Andrey
@Andrey, Javascript - это не ваш обычный язык! Вы не можете импортировать другие модули разумным способом, поэтому, если я включу небольшую, скажем, связанную реализацию списка для Raphael, ее нужно будет встроить во внутреннюю функцию Рафаэля, чтобы она не подвергалась воздействию пользователя Рафаэля. Я не могу просто «включить» его ... –
См. Http://stackoverflow.com/questions/2230469/javascript-sandbox-unit-testing http://stackoverflow.com/questions/716207/testing-private -functions-in-javascript http://stackoverflow.com/questions/1881078/testing-javascript-functions-inside-anonymous-functions et all – gnarf