2015-05-29 1 views
0

Мы только начинаем с того, что в нашем проекте, основанном на додзё, проводятся некоторые модульные тесты, запущенные в Intern.Не удается выполнить модульные тесты на модулях с зависимостями от dojo 1.x с использованием Intern

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

/<path/to/dev/folder>/app/node_modules/intern/node_modules/dojo/dojo.js:406 
       match = mid.match(/^(.+?)\!(.*)$/); 
         ^
    TypeError: Cannot read property 'match' of null at getModule (/<path/to/dev/folder>/app/node_modules/intern/node_modules/dojo/dojo.js:406:15) at mix.amd.vendor (/<path/to/dev/folder>/app/node_modules/intern/node_modules/dojo/dojo.js:832:17) at /<path/to/dev/folder>/app/src/simplebuilding/model/ModelError.js:10:1 
    at exports.runInThisContext (vm.js:74:17) 
    at Object.vm.runInThisContext (/<path/to/dev/folder>/app/node_modules/intern/node_modules/istanbul/lib/hook.js:163:16) 
    at /<path/to/dev/folder>/app/node_modules/intern/node_modules/dojo/dojo.js:762:8 
    at fs.js:334:14 
    at FSReqWrap.oncomplete (fs.js:95:15) 

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

define({ 
    proxyPort: 9000, 
    proxyUrl: 'http://localhost:9000/', 
    capabilities: { 
     'selenium-version': '2.41.0' 
    }, 
    { browserName: 'chrome', version: '40', platform: [ 'OS X' ] } 
    ], 
    maxConcurrency: 3, 
    tunnel: 'NullTunnel', 
    loader: { 
    // Packages that should be registered with the loader in each testing environment 
    packages: [ 
     { name: 'dojo', location: 'src/dojo' }, 
     { name: 'dojox', location: 'src/dojox' }, 
     { name: 'dijit', location: 'src/dijit' }, 
     { name: 'app', location: 'src/app' }, 
     { name: 'tests', location: 'tests' } 
    ], 
    map: { 
     '*': { 
     'dojo' : 'dojo' 
     }, 
     app : { 
     'dojo' : 'dojo' 
     }, 
     intern : { 
     'dojo' : 'node_modules/intern/node_modules/dojo' 
     }, 
     'tests' : { 
     'dojo' : 'dojo' 
     } 
    } 
    }, 
    suites: [ 'tests/model/modelerror' ], 
    functionalSuites: [ /* 'myPackage/tests/functional' */ ], 
    excludeInstrumentation: /^(?:tests|test\-explore|node_modules)\// 
}); 

Файл испытуемый имеет зависимость от додзё/_Образы базовой/Провозглашение додзё/_Образы базовой/Ланг, и додзё/Stateful, и это о нем.

Я создал фиктивный класс, чтобы проверить, где не было зависимостей dojo, и он работает нормально.

Я попытался переключить загрузчик на локальную версию dojo 1.10.3, которую мы имеем в нашем проекте, и это порождает совершенно разные ошибки, связанные с невозможностью найти стажера (даже если я дам ему определение пакета в config). Эти ошибки выглядят следующим образом:

{ [Error: ENOENT, no such file or directory '/<path/to/dev/folder>/app/node_modules/.bin/main.js'] 
    errno: -2, 
    code: 'ENOENT', 
    path: '/<path/to/dev/folder>/app/node_modules/.bin/main.js', 
    syscall: 'open' } 

Наша структура проекта довольно прямолинейно:

root 
|--src 
    |--dojo (dijit/dojox/dgrid/etc) 
    |--app 
|--tests 
    |--intern.js (config file) 

Я пробовал несколько вариантов, кроме изменения загрузчика, как пытаются убедиться, что базовый путь верный. Я попытался запустить его в узле 0.10.36 и 0.12.2. Но каждый раз, когда я отлаживаю это с помощью узла-инспектора, когда он загружает модуль для моего тестируемого файла, а середина имеет значение NULL и прыгает обратно в стеке, он выглядит нормально, но что-то теряется в vm.runInThisContext() вызов, а середина исчезает к моменту вызова метода getModule().

Любая помощь приветствуется - спасибо!

ответ

0

Итак, я понял, что у нас есть модули, которые мы загружали внутри нашего проекта, который использовал старый стиль функции define(). Мы перешли от старого define('my.module.namespace', ['deps'], function(deps){ ... }); к замене пространства имен точек для модуля в первом аргументе нулевым. Мы делали это как переходный этап, чтобы полностью устранить этот аргумент, но никогда не заканчивали этот переход. Это заставило загрузчика dojo2 думать, что «id» модуля имеет значение NULL, и это заставляет загрузчик не найти идентификатор модуля.

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