У меня есть шаблон модуля, сделанный следующим образом:
var A = (function(x) {
var methodA = function() { ... }
var methodB = function() { ... }
var methodC = function() { ... }
...
...
return {
methA: methodA,
methB: methodB
}
})(window)
Этот код позволяет мне вызывать только methA и methB()
на A
, что я хочу и что мне нравится. Теперь проблема, которая у меня есть: я хочу провести модульное тестирование без боли или, по крайней мере, с минимальными усилиями.
Во-первых Хотя я могу просто вернуть this
, но ошибся. Он возвращает объект window
(может кто-нибудь объяснить, почему?).
Второе – я нашел решение где-то в Интернете – включить этот метод в мой блок возврата:
__exec: function() {
var re = /(\(\))$/,
args = [].slice.call(arguments),
name = args.shift(),
is_method = re.test(name),
name = name.replace(re, ''),
target = eval(name);
return is_method ? target.apply(this, args) : target;
}
Этот метод позволяет мне вызывать методы следующим образом: A.__exec('methA', arguments);
Это почти то, что я хочу, но довольно уродливо. Я бы предпочел A.test.methA()
, где test
никогда не будет использоваться в рабочем коде - только для раскрытия частных методов.
РЕДАКТИРОВАНИЕ Я вижу людей, которые советуют мне тестировать что-то большое, а не мелкие детали. Позволь мне объяснить. На мой взгляд, API должен раскрывать только нужные методы, а не набор внутренних функций. Внутренности из-за их небольшого размера и ограниченной функциональности гораздо проще протестировать, чем протестировать все это целиком и угадать, какая часть пошла не так.
Хотя я могу ошибаться, я все же хотел бы посмотреть, как я могу вернуть ссылки на все методы из самого объекта :).