В этой статье мы собираемся разработать пример плагина jQuery с помощью jsTestDriver, небольшого фреймворка для написания автоматических тестов.
плагины jQuery
Плагины в jQuery — это просто функции, добавленные в jQuery.fn, который является прототипом объектов, создаваемых $ (). Таким образом, они будут привязаны к текущему элементу, возвращенному функцией $ (), где вы сможете их вызвать.
Плагин ссылается с этим как текущий объект, где они применяются; это , как правило , список узел , представляющий несколько элементов. Вы можете все плагины с:
$ (‘# elementId’). PluginName ();
Как правило, плагины должны быть определены в закрытии, чтобы избежать случайного загрязнения глобальной области видимости. Более того, когда они не возвращают значение, они должны просто возвращать это, чтобы поддерживать типичную цепочку JQuery.
jsTestDriver
jsTestDriver — это среда тестирования javascript. Он захватывает браузеры и заставляет их выполнять код JavaScript: после захвата вы можете использовать его из командной строки для многократного выполнения модульных тестов каждый раз, когда вы добавляете тест или реализуете функциональность.
Этот инструмент способен имитировать DOM-узлы, создавая их на лету и не привязывая ничего к реальному объекту документа. Вы должны написать достаточно свободный от браузера код, чтобы можно было работать без реального документа (и я покажу вам, как в этой статье).
Пример
Мы собираемся написать пример плагина jQuery maxHeight . Его цель — вернуть максимальную высоту набора элементов. Чтобы узнать, как настроить jsTestDriver, обратитесь к моей статье « Хотите узнать больше?». раздел.
Мы начнем с минимальной конфигурации, включая только jQuery, наш тест и наш исходный файл:
server: http://localhost:4224 load: - http://code.jquery.com/jquery-1.7.1.js - src/*.js - test/*.js
Ожидается, что тест сможет вызывать maxHeight () на узлах с поддержкой jQuery. Когда мы создаем DOM-узлы с комментариями jsTestDriver, они впоследствии становятся доступны для этого :
TestCase("maxHeightPluginTest", { 'test returns the height of a DIV' : function () { /*:DOC divElement = <div style="height: 100px;"></div>*/ assertEquals(100, $(this.divElement).maxHeight()); } });
Первая реализация — просто пример Fake It , чтобы мы могли получить ходячий скелет. Единственный сложный код — это замыкание, автоматически вызываемое передачей jQuery, чтобы сохранить глобальную область видимости от случайного введения переменных:
(function ($) { $.fn.maxHeight = function() { return 100; } })(jQuery);
Теперь мы можем добавить еще один тест, который должен нарушить текущую ложную реализацию:
TestCase("maxHeightPluginTest", { 'test returns the height of a div' : function () { /*:DOC divElement = <div style="height: 100px;"></div>*/ assertEquals(100, $(this.divElement).maxHeight()); }, 'test returns the height of the current div' : function () { /*:DOC divElement = <div style="height: 200px"></div>*/ assertEquals(200, $(this.divElement).maxHeight()); } });
И реализовать это:
(function ($) { $.fn.maxHeight = function() { return this.height(); } })(jQuery);
Я думаю, что вы получили базовый цикл: каждый тест заставляет нас сделать код немного более общим.
Окончательный результат этого теста:
TestCase("maxHeightPluginTest", { 'test returns the height of a div' : function () { /*:DOC divElement = <div style="height: 100px;"></div>*/ assertEquals(100, $(this.divElement).maxHeight()); }, 'test returns the height of the current div' : function () { /*:DOC divElement = <div style="height: 200px"></div>*/ assertEquals(200, $(this.divElement).maxHeight()); }, 'test returns the maximum height of multiple divs' : function () { /*:DOC container = <form> <div style="height: 100px"></div> <div style="height: 200px"></div> <div style="height: 50px"></div> </form> */ var divs = $(this.container).children('div'); assertEquals(200, divs.maxHeight()); } });
Который заставил этот код быть написанным:
(function ($) { $.fn.maxHeight = function() { var max = null; this.each(function () { var currentHeight = $(this).height(); max = Math.max(currentHeight, max); }); return max; } })(jQuery);
Хочу больше?
Весь пример кода на Github .
Я написал о jsTestDriver и о том, как с его помощью генерировать элементы DOM на этом сайте.
Существует часовую презентацию доступны от автора Test-Driven развития JavaScript, Кристиан Йохансен, где он развивает клиентскую часть предложений поиска Google с TDD. Презентация включает в себя более крупный пример, чем этот, включая объекты презентатора и озвучивание вызовов Ajax. Если вы обычно пишете JavaScript с ковбойским кодированием, как это делают многие из нас, я советую вам посмотреть его.