2012-05-24 8 views
7

Вау, какой беспорядок. Это сценарий.Жасмин + JSTestDriver + Покрытие + RequireJS

  • Магистральный привод JS.
  • RequireJS для функциональности AMD, инициализируется так:

    <script data-main="js/main" src="js/require.js" type="text/javascript"></script> 
    

    затем внутри main.js следующий код конфигурации:

    require.config(
    { 
        paths: 
        { 
         ... : ... 
        } 
    }); 
    

    Каждый Backbone View/модель/маршрутизатор является «определить (. ..) "и" require ("theOneRouter", ...) "вызывается один раз в main.js.

  • r.js используется как оптимизатор с Uglify/Closure. Один «скомпилированный» main.js создается в подкаталоге ./release, который я динамически выбираю в рамках моей .net.

  • Потребовалось некоторое время, чтобы получить опорную магистраль + Require.JS, но отлично работает сейчас!

  • Тогда шлепанье Жасмина на вершине этого также заняло небольшую индивидуальную работу, но все получилось просто отлично. Мне пришлось загрузить require.js из моего SpecRunner.html, определить каждый тестовый модуль как AMD, используя вызов define (...), и я создаю экземпляр & запустите Jasmine один раз после вызова вызова require (...) в SpecRunner.html:

    require(
    [ 
    //"test/specs/testSpec1", 
    "test/specs/views" 
    ], 
    function() 
    { 
        jasmine.getEnv().updateInterval = 1000; 
        var reporter = new jasmine.TrivialReporter(); 
        jasmine.getEnv().addReporter(reporter); 
        .... 
        .... 
    }); 
    

    это тоже отлично работает. Тесты загружаются & run, без проблем. Требование заботится обо всем.

Теперь я хотел бы, чтобы механизм, такой как JSTestDriver, стал моим бегуном. Я выбрал JSTD, потому что это простота, возможность тестирования на удаленных браузерах, поддержка покрытия кода, но я все еще открыт для других предложений.

JSTestDriver сам по себе работает нормально, единственная проблема, с которой я столкнулся, заключается в совместном использовании JSTD + Jasmine + ReuireJS. Самой большой проблемой является, если я скажу JSTD в конфигурационном файле о Jasmine/Требуют тестовый модуль для того, чтобы загрузить его, я получаю следующее сообщение об ошибке:

http://requirejs.org/docs/errors.html#mismatch

Если я использую r.js в optmize все мой код в один main.js, комбинация работает, в том числе Coverage, но покрытие собирается на один гигантский файл и трудно анализируется. Не говоря уже о том, что очень долго приходится обрабатывать файл js 50k-строк кода и запускать его через JSTD.

Я попытался создать файл js-файла, который загружает все мои тестовые модули Jasmine &, но я продолжаю возвращаться к вышеуказанной ошибке «несоответствия», И, если я не расскажу JSTD о каждом модуле отдельно (загружая html/js-устройство, которое выполняет реальную загрузку), они не получат инструментарий для покрытия кода.

Кто-нибудь получил эту конкретную комбинацию для работы? Возможно, я прошу слишком много ...

ответ

4

Решение точно так, как упомянуто devadvocate. Поскольку JsTestDriver и Require.js конкурируют за то, чтобы управлять загрузкой файлов/зависимостей, JsTestDriver бросает пригонку, когда вы пытаетесь сделать это на 100% способом Require.js (с анонимными модулями и определяет). Вместо этого вы должны называть свои модули и использовать require ([...], function (...) {... вместо define ([...]. Я написал сообщение, в котором показано, как интегрировать QUnit, Requirejs, и покрытие кода с помощью JSTD: js-test-driver+qunit+coverage+requirejs.Я использую QUnit в своем примере, но вы можете легко заменить QUnit для Jasmine. Пытаясь понять это, я рассматривал просто использование PhantomJS, но для нашей пользовательской базы очень важно, чтобы у нас был кросс-браузер тестирование IE7, IE8, IE9 и т. д., поэтому один WebKit не сократил бы его. JsTestDriver очень полезен, но я боюсь, что плохая документация отключит разработчиков. Скоро я получу код для моего примера на GitHub . Надеюсь, что это помогает.

+0

Спасибо за ввод, хороший комментарий. Да, вы правы в своих точках, и я пробовал вручную называть мои модули и использовать вызовы вместо функции define(), но это не приемлемое решение: даже если оно автоматизировано, для этого потребуется существенная дополнительная работа, выполняемая до каждый тестовый прогон, который я бы хотел избежать во время разработки тестов во время разработки. – Bernardo

+1

Итак, теперь у меня есть исправленная версия jsTestDriver.jar, которая позволяет экслюзионы файлов с помощью регулярных выражений. Он также позволяет загружать файлы JavaScript из раздела «serve». Обслуживание исходных файлов JavaScript означает, что они не будут автоматически выполняться при загрузке страниц браузеров. Вместо этого, когда браузер выполняет require.js, require может вытащить файлы из секции обслуживания. Таким образом, модули могут быть анонимными без каких-либо проблем. См. [Магистральная проверка] (http://pseudobry.com/backbone-testing/) – jdobry

2

Мне не удалось заставить это работать, и в конечном итоге я использовал PhantomJS для запуска тестов на жасмин. http://phantomjs.org/

+0

Я рассмотрел PhantomJS, но точка JSTD является запуск модульных тестов кросс-платформенных, которая PhantomJS не поддерживает быть обезглавленный веб-набор. Я предполагаю, что это приводит к вопросу о том, нужны ли кросс-платформенные модульные тесты: следует ли запускать единичные тесты в безголовой среде и сосредоточиться только на выполнении тестов интеграции/приёма в среде, подобной селену? – Bernardo

+0

Я построил собственное решение для запуска модульных тестов в кросс-браузере. Я не автоматизирую процесс, но вы можете легко расширить это решение. Вот ссылка на мой пост в блоге -> [link] (http://blakeblackshear.wordpress.com/2011/12/09/a-simple-way-to-run-unit-tests-across-browsers-with -nodejs-socket-io-and-jasmine /) –

+0

После нескольких недель экспериментов я все еще убежден, что модульные тесты должны запускаться в среде браузера, а не без головы. По этой причине я экспериментировал с Selenium и размещенным решением SauceLabs, и до сих пор большинство работает. Единственным препятствием для меня является охват кода: JSTD имеет приятный плавно интегрированный инструмент и отчетность по охвату, и я не могу найти сравнительно умного инструментария там, где вы можете создать обычную среду для spun. – Bernardo

2

Вы пытались назвать ваши модули под тестированием и использовать требование вместо определения в своих тестах?

https://github.com/podefr/jasmine-reqjs-jstd

Edit:

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

Он предоставляет единые команды для запуска: веб-сервер dev, одиночный тестовый бегун jasmine single browser, jasmine js-test-driver multi browser test runner и конкатенизацию/минимизацию для JavaScript и CSS. Он также выводит неограниченную версию вашего приложения для производственной отладки, прекомпиляции ваших шаблонов руля и поддерживает интернационализацию. Установка не требуется. Это просто работает.

Он также поддерживает тестируемые неназванные модули.

http://github.com/davidjnelson/agilejs

+0

Yup, я видел этот проект, и у меня был успех, но он слишком громоздкий. В большом проекте с множеством модулей требуется много других модулей, мне нужно будет создать систему, чтобы автоматически назвать все модули под тестом. Большая боль, имхо. Я нашел более чистое решение с Selenium & Node Coverage ... – Bernardo

+0

Я решил эту проблему с помощью моего нового инструментария agilejs: http: // github.com/davidjnelson/agilejs – davidjnelson

0

Заканчивать этот репо (Bredele appolo), это среда, которая работает жасмин BDD спецификации более анонимных модулей нагруженных require.js и JsTestDriver.

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

Оливье