Почему зависает grunt-contrib-jasmine?

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

У меня есть приложение, которое использует require.js и тесты на основе jasmine, автоматизированные с помощью grunt.

Я сгруппировал свои модули в логические компоненты, каждый из которых находится в каталоге под app. Мой вызов requirejs.config() устанавливает префиксы пути для этих компонентов следующим образом:

paths: {
    /*... vendor libraries are listed here ...*/
    ui: 'app/ui',
    data: 'app/data',
    /* etc */
}

Затем я могу указать зависимости от этих модулей следующим образом:

define([ 'ui/some/module', 'data/another/module' ], function(ui_module, data_module) {
    /* code for module being defined goes here */
});

Мое приложение работает, и мои тесты проходят в моем веб-раннере, который следует структуре, аналогичной той, что я использовал в приложении, которое представляет собой один элемент <script> в теле документа, указывающий на require.js, с набором data-main на test/index, который содержит очень похожий вызов requirejs.config(), только с дополнительными путями для самих тестов, и вызов window.onload(), который запускает тесты.

Однако когда я использую grunt-contrib-jasmine, тесты зависают и тесты не запускаются. Сообщение, которое я получаю:

>> Error: timeout: Load timeout for modules: [list of modules, all my own application modules]
>> http://requirejs.org/docs/errors.html#timeout at
>> http:/127.0.0.1:8000/_SpecRunner.html:21 
>> http:/127.0.0.1:8000/.grunt/grunt-contrib-jasmine/require.js:12 v
>> http:/127.0.0.1:8000/.grunt/grunt-contrib-jasmine/require.js:14 C
>> http:/127.0.0.1:8000/.grunt/grunt-contrib-jasmine/require.js:14 

Как мне заставить мои тесты проходить под ворчанием?


person leftclickben    schedule 15.10.2014    source источник


Ответы (1)


Оказывается, префиксы пути в моем вызове requirejs.config() должны содержать завершающую косую черту:

paths: {
    /*... vendor libraries are listed here ...*/
    ui: 'app/ui/',
    data: 'app/data/',
    /* etc */
}

Итак, 'app/ui/' вместо 'app/ui'.

Я до сих пор не уверен в основной причине этого, потому что обе версии работают в браузере; возможно, это другая версия require.js, используемая задачей grunt, или, возможно, это что-то особенное для фантома.

Оставив этот вопрос и ответ, чтобы он мог сэкономить кому-то время.

person leftclickben    schedule 15.10.2014
comment
Если кто-то хочет расширить это, включая основную причину, я буду рад отметить этот ответ как правильный, в противном случае я отмечу этот ответ как правильный, когда SO позволит мне. - person leftclickben; 15.10.2014