2014-12-05 3 views
4

Допустим, у меня есть проект, который использует беседу, ворчание, bowerify (с прокладкой), и так как я очень люблю Jest, я хочу проверить это. Как в мире я получаю шутку, чтобы увидеть мои браузерные модули прокладки при выполнении тестов. Я использую grunt, чтобы запустить команду проверки npm. Вот мой файл package.json.Загрузка модуля Jest и Bower в тестах шутки

"browser": { 
    "jquery": "./bower_components/jquery/dist/jquery.js", 
    "foundation": "./bower_components/foundation/js/foundation/foundation.js", 
    "fastclick": "./bower_components/fastclick/lib/fastclick.js", 
    "greensock-tm": "./bower_components/gsap/src/uncompressed/TweenMax.js", 
    "greensock-css": "./bower_components/gsap/src/uncompressed/plugins/CSSPlugin.js", 
    "greensock-time": "./bower_components/gsap/src/uncompressed/TimelineMax.js", 
    "scrollmagic": "./bower_components/ScrollMagic/js/jquery.scrollmagic.js", 
    "handlebars": "./bower_components/handlebars/handlebars.runtime.js" 
    }, 
    "browserify-shim": { 
    "jquery": "$", 
    "greensock-css": "CSSPlugin", 
    "fastclick": "FastClick", 
    "greensock-tm": "TweenMax", 
    "greensock-time": "TimelineMax", 
    "scrollmagic": "ScrollMagic", 
    "foundation": "foundation", 
    "handlebars": "Handlebars" 
    }, 
    "browserify": { 
    "transform": [ 
     "browserify-shim" 
    ] 
    }, 

Прямо сейчас я почти все это разработал, выполнив это в своем файле grunt, прежде чем запускать тест.

grunt.registerTask("shimBowerForTests",function(){ 
    var readJson = require('read-package-json'); 
    var fs = require('fs'); 
    var remapify = require('remapify'); 
    readJson('./package.json', console.error, false, function (er, data) { 
     if (er) { 
     throw "There was an error reading the file"; 
     } 
     var packages = data.browser; 
     var browserify = require('browserify'); 
     for (var key in packages){ 
     var b = browserify(); 
     var wstream = fs.createWriteStream("devjs/test/modules/"+key+'.js'); 
     b.add(packages[key]); 
     b.bundle().pipe(wstream); 
     } 
    }); 
    }); 

и.

exec: { 
     jestTest: { 
     command: 'cp -r devjs/modules devjs/test/modules && npm test' 
     } 
    } 

Проблема заключается в том, что использование browserify так объединить все для браузера прекрасно работает с моей установкой, и я могу требовать моей подкладки модули, как это. require('jquery') //example, но в шутке кли тест терпит неудачу, потому что они могут найти модуль, если я что-то не префикс с ./, как так require('./jquery')

ответ

0

UPDATE

Вместо того, чтобы использовать мое решение ниже, вы должны выбрать для использования Карма, карма browserify. Я преобразовал приведенное ниже решение в использование кармы, и он работает намного лучше.

---------------------- OLD ANSWER Что я на самом деле делал для решения этой проблемы, использовал препроцессор источника Jest, чтобы переписать инструкцию require для просмотра для модуля в определенном каталоге в моей/tests/папке, которую я создал с помощью grunt. Папка содержит файлы, перечисленные в моем браузере-обойме, в разделе браузера файла package.json.

EDIT: Вот как я обнимаю беседу, я сделал этот скрипт в Gruntfile.js, который ставит все модули bower и любые модули commonjs, которые мне нужны, в доступный каталог.

grunt.registerTask("shimBowerForTests", function() { 
    var readJson = require('read-package-json'); 
    var fs = require('fs'); 
    readJson('./package.json', console.error, false, function(er, data) { 
     if (er) { 
     throw "There was an error reading the file"; 
     } 
     var packages = data.browser; 
     var shim = data['browserify-shim']; 
     var browserify = require('browserify'); 
     var exclude = ["jquery.maskedinput", "jquery"]; 
     for (var key in packages) { 
     var b = browserify(); 
     var wstream = fs.createWriteStream("devjs/test/modules/" + key + '.js'); 
     if (shim[key] !== undefined && exclude.indexOf(key) === -1) { 
      b.add(packages[key]); 
      b.bundle().pipe(wstream); 
     } else { 
      var rstream = fs.createReadStream(packages[key]); 
      rstream.pipe(wstream); 
     } 
     } 
    }); 
    }); 

Тогда в файле предварительного процессора Jest я делаю это.

module.exports = { 
    process: function(src, path) { 
    var src2= src.replace(/require\([\"\']([^\.\'\"]+)[\"\']\)/g, "require(\'../modules/$1\')"); 
    src2= src2.replace(/jest\.dontMock\([\"\']([^\.\'\"]+)[\"\']\)/g, "jest.dontMock(\'../modules/$1\')"); 
    return src2; 
    } 
}; 
+3

Не могли бы вы добавить фрагмент кода для того, что вы сделали в препроцессоре? – stefvhuynh

+0

Сделаю немного. – austbot

+1

@AustinAdams Мне также было бы интересно увидеть ваше решение, поскольку я пытаюсь сделать то же самое со шуткой, беседкой и webpack. –

2

Я предполагаю, что проблема заключается в том, что вы только что установили подкладки модулей с Беседки. Если вы хотите, чтобы они работали в узле/jest, вам также нужно будет установить их с помощью npm. Затем просто убедитесь, что Jest не издевается над чем-либо в каталоге node_modules, и он должен найти все необходимые модули там, пока имена совпадут.

Ваш Jest конфигурации в package.json должен выглядеть следующим образом:

"jest": { 
    "unmockedModulePathPatterns": [ 
    "./node_modules" 
    ] 
} 

А потом просто загрузить все зависимости.

npm install jquery --save-dev