Может ли JavaScript быть «модульным тестируемым», если он помещен в самозапускающуюся анонимную функцию - PullRequest
11 голосов
/ 17 августа 2011

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

Ответы [ 2 ]

6 голосов
/ 19 августа 2011

Я согласен, что вы не хотите выполнять Бэкдор Манипуляция , находя хитрые способы для дискретного тестирования частных методов.

Однако, как вы указали, лиги на лигах веб-приложенийбыли написаны как один гигантский самоисполняющийся шарик грязи, которому не хватает именования или публичного API.Это совершенно другая проблема, с которой вряд ли можно столкнуться во многих других технических стеках.

Одно из огромных преимуществ TDD'ing JavaScript для веба заключается в том, что он заставляет вас писать JavaScript, который можно использовать как минимум двумявечеринки: ваше веб-приложение + ваш юнит-тест.

Я несколько раз играл в эту унаследованную спасательную игру с Jasmine:

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

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

  3. Как только вы станете зеленым, начните рефакторинг в маленькие, хорошо названные, хорошо организованные методы / пространства имен

  4. Напишите изолированные тесты для характеристикиэти единицы

  5. Съешьте бутерброд и подумайте, насколько полезны эти функциональные тесты (если у вас нет тестов с полным стеком, то они, вероятно, есть; если у вас уже есть хороший полный стектесты, вероятно, слишком избыточны, чтобы гарантировать их поддержание).Поскольку я обычно веду разработку с помощью Cucumber / Capybara , я не вижу особой ценности в написании интегрированных тестов с Jasmine.

2 голосов
/ 17 августа 2011

Вы просто проводите все свои тесты для этой "публичной" функции, смотрите, например, официальное ядро ​​jQuery набор тестов

Фрагмент:

// Basic constructor's 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([])" );

Вам не нужно получать доступ к закрытым функциям для проверки публичного поведения.

...