Как я могу проверить клиентский coffeescript / js, используя узел с expresso / jasmine / <other> - PullRequest
3 голосов
/ 12 августа 2011

У меня есть веб-приложение, в котором материал на стороне клиента написан с помощью coffeescript и загружен с require.js.

Я бы хотел иметь возможность изолировать и протестировать этот материал с помощью основанного на узле средства запуска тестов, такого какExpresso (хотя другие предложения приветствуются), чтобы я мог интегрировать тестирование на стороне клиента с нашим CI-сервером, который в настоящее время является Team City.

Вот мой каталог:

.
├── coffee
│   ├── models
│   ├── node_modules
│   │   └── expresso
│   ├── spec
│   ├── tests
│   └── views
├── static
│   └── js
│       ├── lib
│       ├── models
│       ├── tests
│       └── views

Этиподключаются с помощью require.js примерно так:

deps = [
   "lib/backbone", "models/websocket_collection", "/static/js/lib/date.js"
]

define(deps, (Backbone, ws) ->
    # module code and exports here

и загружаются в браузер примерно так:

<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="my_mod" src="/static/js/my_mod.js"></script>

В мире идей сейчас я бы хотел иметь возможностьтестовый модуль, который выглядит следующим образом:

{Model1, Model2} = require "models/some_module"

exports.test_a = ->
    assert.equal # etc etc

У меня есть несколько проблем (я действительно не использовал серверную часть узла, кроме случаев, когда я играл с zombie.js)

  1. Каксообщить узлу, где находятся все мои обычные зависимости javascript (в static / js / lib), некоторые из них загружены, но backbone.js был размечен с помощью require.js и определяет такие вещи, как

    define(function(require, exports, module) {
        (function(){
    
  2. Как сделатьЯ действительно запускаю тесты?Я пробовал r.js (который, как я понимаю, должен быть мостом между требованием на стороне браузера и требованием узла)

проблема, которую я получаю:

ReferenceError: define is not defined

Я также пытался требовать ("allplugins-require"), который является скриптом, который я загружаю на стороне браузера для сбора всего моего клиентского кода, но, похоже, нарушает требование узла.

  • Кто-нибудь делает это?
  • Если вы этого не делаете, как вы тестируете свой код (бонусные баллы за интеграцию с CI)?
  • Любые альтернативы для управления require.jsзависимости на стороне клиента, которые могли бы играть немного лучше на стороне сервера?

Я был бы очень рад услышать альтернативные подходы, которые используют люди.

Спасибо, Бен

Ответы [ 3 ]

3 голосов
/ 14 августа 2011

Документы для запуска requirejs через r.js в узле находятся здесь . В частности, r.js заменяет узел require своим собственным. Он может загружать только узлы пакеты / модули, которые установлены через npm, если модули, установленные npm, не видны в конфигурации require.js.

Еще одно предостережение: r.js должен быть файлом-близнецом к main.js, файлу js приложения верхнего уровня, который запускается в среде узла.

Последний код для r.js будет поддерживать загрузку requirejs в качестве модуля узла (как в require ('requirejs'), и это даст лучшую историю интеграции. Это изменение будет в выпуске 0.26.0.

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

Я потратил много времени, пытаясь заставить это работать, и в конце концов сдался.Я все заработал, ссылаясь на все мои зависимости require.js в глобальной переменной и используя ее для тестов node.js, но дизайн был настолько уродливым, что я чувствовал, что победил эту точку.

Мой текущий подход:

  • написать мои модули JavaScript как модули CommonJS
  • Использовать интеграцию Jasmine BDD для тестирования моих модулей на стороне сервера
  • Используйте стежок , чтобы модули CommonJS работали на стороне клиента

Это хорошо работает для меня со следующими предостережениями:

  • Отладка на стороне клиента сложна, потому что stitch объединяет все мои сценарии.Я обнаружил, что исключение таких библиотек, как jQuery, из конфигурации stitch помогло в этом.
  • У меня нет никакого способа отладки на стороне сервера.Существует отладчик node.js , но он не работает с несколькими последними версиями узла.
1 голос
/ 17 августа 2011

Хорошо, несколько дней взлома, и теперь я получил свой код на стороне клиента (часть его в любом случае) упакован в виде модулей commonjs и протестирован с помощью jasmine-node.

Если кому-то интересно, я разветвил jasmine-node, чтобы добавить вывод xml-файла, который интегрируется с CI-сервером. Это работает очень хорошо.

Я вернусь после того, как получу стежок и заработаю.

Вот моя вилка: https://github.com/boothead/jasmine-node

...