Как я вижу много раз, самозаверяющая анонимная функция используется для хранения целых библиотек. Как можно протестировать эти библиотеки, если, например, QUnit не может получить доступ к чему-либо внутри оболочки анонимных функций?
Может ли JavaScript быть "единичным тестируемым", если он завернут в самоисполняющуюся анонимную функцию
Ответ 1
Я согласен с тем, что вы не хотите выполнять Backdoor Manipulation путем поиска скрытых способов дискретного тестирования частных методов.
Однако, как вы указали, лиги на лигах веб-приложений были написаны как один гигантский самоисполняющийся шар грязи, который не имеет никакого именования или публичного API. Это совершенно другая проблема, с которой вряд ли можно столкнуться во многих других технологических пакетах.
Одним из огромных значений TDD для JavaScript для Интернета является то, что он заставляет вас писать JavaScript, который может использоваться хотя бы двумя сторонами: ваше веб-приложение + ваш unit test.
Я играл в эту легендарную спасательную игру несколько раз с Жасмин:
-
Если это неназванный, оберните каждый кусок функциональности в самоисполняемый, именованный метод
-
Охарактеризуйте те методы с функциональными Jasmine. Я люблю Жасмин по множеству причин, но на самом деле у него есть шанс на спасение из-за его способности группировать группы примеров. Например, всякий раз, когда код, который я характеризую, имеет анонимную функцию, обычно можно использовать группу вложенных примеров, чтобы дискретно характеризовать поведение этой вложенной функции, набирая ее шпионом и вызывая ее в разных контекстах.
-
Как только вы будете зелеными, начните рефакторинг в маленькие, хорошо названные, хорошо организованные методы/пространства имен
-
Напишите изолированные тесты, чтобы охарактеризовать эти единицы.
-
Ешьте сэндвич и задумайтесь над тем, являются ли эти функциональные тесты по-прежнему ценными (если у вас нет полных тестов стека, которые они, вероятно, есть; если у вас уже есть хорошие тесты полного стека, это, вероятно, слишком избыточно, чтобы гарантировать сохранение их). Поскольку я обычно управляю разработкой с помощью Cucumber/Capybara, Я не вижу большого значения при написании интегрированных тестов с Jasmine.
Ответ 2
Вы просто делаете все свои тесты на этой "общедоступной" функции, см., например, официальный ядро jQuery
Fragment:
// Basic constructor behavior
equals( jQuery().length, 0, "jQuery() === jQuery([])" );
equals( jQuery(undefined).length, 0, "jQuery(undefined) === jQuery([])" );
equals( jQuery(null).length, 0, "jQuery(null) === jQuery([])" );
equals( jQuery("").length, 0, "jQuery('') === jQuery([])" );
equals( jQuery("#").length, 0, "jQuery('#') === jQuery([])" );
Вам не нужно обращаться к закрытым функциям для проверки общественного поведения.