2009-12-10 8 views
7

Можно ли проверить myInnerFunction?Тестирование функций JavaScript внутри анонимных функций

var val = function() { 
    var myInnerfunction = function(input) { 
     return input + ' I ADDED THIS'; 
    }; 
    return myInnerfunction('test value'); 
}(); 

Поскольку myInnerFunction по существу является частным членом анонимно выполненной внешней функции, она не кажется, что это проверяемые с внешней стороны.

+1

Ответы поднимают более широкий вопрос сейчас. Это был тривиальный пример. У меня есть функции JS, которые тесно связаны с ожидаемой структурой DOM, с которой они связаны, и не могут быть задействованы в общем API коммунальных служб. Мне нужно проверить эти функции; их логика значительна, но все они объявлены на DOM-ready в функциональном литерале и прикреплены как обработчики событий к элементам DOM. Они по сути являются частными и тесно связаны с структурой DOM, но мне все равно нужно их протестировать. Где они должны проживать, чтобы я мог получить к ним доступ из моих тестов? –

+0

Чтобы использовать методы, которые я хочу протестировать из анонимной функции, выполненной в режиме готовности к работе в библиотеке, я им разместил их в пакете, который соответствует функциональности, действующей на моей странице. Хотя этот код действительно будет использоваться только на этой конкретной странице, и только через обработчики событий, которые я добавил в эту конкретную DOM, по крайней мере, я могу проверить эту логику сейчас. Спасибо всем за то, что вы меня направили. Любые дальнейшие мысли приветствуются. –

ответ

1

Я думаю, что мой ответ для этого (как и многие вещи), что я делаю это неправильно. То, что я определил как «частную» функцию, - это действительно то, что нужно протестировать. Это было только личное, потому что я не хотел раскрывать его в утилите api или что-то в этом роде. Но он все равно может быть открыт через пространство имен приложений.

Таким образом, в рамках анонимной функции, выполняемой на основе dom-ready, я просто привязываю свои предопределенные функции как обработчики событий к соответствующим DOM-перехватам. Сами функции, в то время как они не хранятся с моими более открытыми функциями утилит, по-прежнему хранятся публично в пакете в моем пространстве имен, связанном с структурой DOM, с которой они имеют дело. Таким образом я могу получить их и проверить их соответствующим образом.

1

Тестирование модуля afaik не касается внутренней работы вещей, которые вы тестируете. Дело в том, что вы проверяете функциональность, то есть: что это должно сделать, не так, как. Так что, если он использует внутренний частный элемент, он должен не подлежит проверке ...

1

Вы можете проверить внешнее поведение, которое можно наблюдать. В этом простом случае вы вернули только значение внутренней функции, но в реальном мире вы могли бы объединить результат этой внутренней функции с чем-то другим. Эта комбинация - это то, что вы проверите, а не прямые выходы частного метода.

Попытка проверить частный метод сделает ваш код сложным для изменения и рефакторинга, даже если внешнее поведение сохранено. Тем не менее, мне нравится рассматривать модульные тесты не как обширные тесты вашего кода, а просто предоставление примера API и того, как он ведет себя в разных условиях. ;)

5

Вы можете намеренно подвергать тестированию крюк с внешним миром, как, возможно, этого:

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. Как уже упоминалось, эти крючки необходимо добавить вручную

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

+0

Мне нравится ваш подход, хотя я хочу попытаться сохранить производственный код как можно более чистым. То, что я действительно делаю, - это функция для обработчика событий Dom-ready библиотеки, поэтому я не знаю, смогу ли я это сделать и все-таки получить доступ к ней из библиотеки. –

+0

Именно поэтому я предложил, чтобы процесс сборки блокировал блоки форматированных комментариев, как указано выше. –

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