假设我有一个使用凉亭,咕噜声,bowerify(带垫片)的项目,因为我非常喜欢Jest,所以我想测试一下。在运行测试时,如何在世界上看到我的浏览器垫片模块。我使用grunt来启动npm test命令。 这是我的package.json文件。
"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所以将浏览器的所有内容与我的设置相结合,我可以要求我这样的shimmed模块。
require('jquery') //example
但是在jest cli中测试失败,因为他们可以找到模块,除非我以某种方式用./加前缀,如require('./jquery')
答案 0 :(得分:2)
我猜测问题是你只用凉亭安装了带有垫片的模块。如果您希望它们在node / jest中工作,您也必须使用npm安装它们。然后确保Jest不会在node_modules目录中模拟任何内容,并且只要名称匹配就应该找到所有必需的模块。
package.json
中的Jest配置应如下所示:
"jest": {
"unmockedModulePathPatterns": [
"./node_modules"
]
}
然后只需下载所有依赖项。
npm install jquery --save-dev
答案 1 :(得分:0)
更新
不要使用我的下面的解决方案,你应该选择使用Karma,karma browserify。我已经将下面的解决方案转换为使用业力,它的工作要好得多。
----------------------旧答案 我实际上解决这个问题的方法是,使用Jest源预处理器重写require语句,以查找我使用grunt创建的/ tests /文件夹中某个目录中的模块。该文件夹包含package.json文件的browserify-shim浏览器部分中列出的文件。
编辑:这是我如何冲洗bower,我在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;
}
};