Вы можете намеренно подвергать тестированию крюк с внешним миром, как, возможно, этого:
var val = function() {
var myInnerfunction = function(input) {
return input + ' I ADDED THIS';
};
/* START test hook */
arguments.callee.__test_inner = myInnerFunction;
/* END test hook */
return myInnerfunction('test value');
}();
сейчас, когда вал было работать по крайней мере один раз, вы можете ссылаться на val.__test_inner
и вызвать его с проверяемыми входами ,
Преимущества такого подхода: 1. Вы выбираете то, что подвергается и не (также отрицательное потому что вы должны помнить, чтобы сделать это) 2. все, что вы получаете копию ссылка на частный метод, поэтому вы не можете случайно его изменить, используйте его и посмотрите, что он производит.
Недостатки: 1. Если частный член изменяет (или полагается) состояние своей функции хозяина/родителя, вам будет труднее единичный тест вокруг этого, так как вам необходимо воссоздать или искусственно контролировать состояние хоста/родителя в то же время 2. Как уже упоминалось, эти крючки необходимо добавить вручную
Если у вас действительно умный, вы можете заставить свой процесс сборки искать блоки комментариев, как указано выше, и удалять контрольные крючки при создании вашей сборки.
Ответы поднимают более широкий вопрос сейчас. Это был тривиальный пример. У меня есть функции JS, которые тесно связаны с ожидаемой структурой DOM, с которой они связаны, и не могут быть задействованы в общем API коммунальных служб. Мне нужно проверить эти функции; их логика значительна, но все они объявлены на DOM-ready в функциональном литерале и прикреплены как обработчики событий к элементам DOM. Они по сути являются частными и тесно связаны с структурой DOM, но мне все равно нужно их протестировать. Где они должны проживать, чтобы я мог получить к ним доступ из моих тестов? –
Чтобы использовать методы, которые я хочу протестировать из анонимной функции, выполненной в режиме готовности к работе в библиотеке, я им разместил их в пакете, который соответствует функциональности, действующей на моей странице. Хотя этот код действительно будет использоваться только на этой конкретной странице, и только через обработчики событий, которые я добавил в эту конкретную DOM, по крайней мере, я могу проверить эту логику сейчас. Спасибо всем за то, что вы меня направили. Любые дальнейшие мысли приветствуются. –