Javascript 我如何才能成功地将jquery包含在带有requireJS的karma中?
我正在尝试编写karma测试,其中一些需要jquery。我使用的是requirejs 下面是我的karma.conf.js的相关部分Javascript 我如何才能成功地将jquery包含在带有requireJS的karma中?,javascript,jquery,requirejs,karma-jasmine,Javascript,Jquery,Requirejs,Karma Jasmine,我正在尝试编写karma测试,其中一些需要jquery。我使用的是requirejs 下面是我的karma.conf.js的相关部分 module.exports = function(config) { config.set({ // base path that will be used to resolve all patterns (eg. files, exclude) basePath: '', // frameworks
module.exports = function(config) {
config.set({
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '',
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine', 'requirejs'],
// list of files / patterns to load in the browser
files: [
'spec/test-main.js',
//tests
{pattern: 'spec/**/*.js', included: true},
//application files
{pattern: 'apps/**/*.js', included: false},
//jquery
{pattern: 'bower_components/jquery/src/*.js', included: false, served: true}
],
...
module.exports = function(config) {
config.set({
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '',
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine', 'requirejs'],
// list of files / patterns to load in the browser
files: [
//jquery
{pattern: 'node_modules/jquery/src/*.js', included: false},
{pattern: 'node_modules/jquery/src/**/*.js', included: false},
//application files
{pattern: 'apps/**/*.js', included: false},
//tests
{pattern: 'spec/**/*.js', included: true},
'test-main.js'
],
...
还有我的test-main.js:
var tests = [];
for (var file in window.__karma__.files) {
if (window.__karma__.files.hasOwnProperty(file)) {
if (/spec\.js$/.test(file)) {
tests.push(file);
}
}
}
requirejs.config({
// Karma serves files from '/base'
baseUrl: '/base',
paths: {
'jquery': 'bower_components/jquery/src/jquery'
},
map: {
'*': {
'jquery' : 'jquery'
}
},
shim: {
'jquery': {
exports: '$'
}
},
// ask Require.js to load these files (all our tests)
deps: tests,
// start test run, once Require.js is done
callback: window.__karma__.start
});
var tests = [];
for (var file in window.__karma__.files) {
if (window.__karma__.files.hasOwnProperty(file)) {
if (/spec\.js$/.test(file)) {
tests.push(file);
}
}
}
requirejs.config({
// Karma serves files from '/base'
baseUrl: '/base',
paths: {
'jquery': 'node_modules/jquery/src/jquery'
},
map: {
'*': {
'jquery' : '/base/node_modules/jquery/src/jquery.js'
}
},
shim: {
},
// ask Require.js to load these files (all our tests)
deps: tests,
// start test run, once Require.js is done
callback: window.__karma__.start
});
照目前的情况,我得到:
ReferenceError:$未定义
对于每个点,我都尝试使用jQuery。在浏览器中,我还可以看到:
/base/(myPath).js没有时间戳
其中(myPath)是我的测试文件的路径,我觉得这很奇怪,因为该文件位于karma.conf.js
中为应用程序文件指定的路径下
karma.conf
文件列表中将“included”属性更改为true,我将得到以下错误:karma.conf
中的框架数组中添加'jquery',karma甚至不会启动require(['jquery']),function($){
测试将不会运行,我将得到define(function(require){var$=require('jquery');
,这给了我另一个var$=require('jquery')
导致:无时间戳
错误太好了,有什么建议吗
谢谢
编辑:
经过多次尝试和错误,我想我已经朝着目标取得了一些进展,尽管我还没有完全达到目标
karma.conf.js
module.exports = function(config) {
config.set({
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '',
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine', 'requirejs'],
// list of files / patterns to load in the browser
files: [
'spec/test-main.js',
//tests
{pattern: 'spec/**/*.js', included: true},
//application files
{pattern: 'apps/**/*.js', included: false},
//jquery
{pattern: 'bower_components/jquery/src/*.js', included: false, served: true}
],
...
module.exports = function(config) {
config.set({
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '',
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine', 'requirejs'],
// list of files / patterns to load in the browser
files: [
//jquery
{pattern: 'node_modules/jquery/src/*.js', included: false},
{pattern: 'node_modules/jquery/src/**/*.js', included: false},
//application files
{pattern: 'apps/**/*.js', included: false},
//tests
{pattern: 'spec/**/*.js', included: true},
'test-main.js'
],
...
更改了此处文件的顺序,并添加了jquery的子目录。真正的更改出现在test-main.js中:
var tests = [];
for (var file in window.__karma__.files) {
if (window.__karma__.files.hasOwnProperty(file)) {
if (/spec\.js$/.test(file)) {
tests.push(file);
}
}
}
requirejs.config({
// Karma serves files from '/base'
baseUrl: '/base',
paths: {
'jquery': 'bower_components/jquery/src/jquery'
},
map: {
'*': {
'jquery' : 'jquery'
}
},
shim: {
'jquery': {
exports: '$'
}
},
// ask Require.js to load these files (all our tests)
deps: tests,
// start test run, once Require.js is done
callback: window.__karma__.start
});
var tests = [];
for (var file in window.__karma__.files) {
if (window.__karma__.files.hasOwnProperty(file)) {
if (/spec\.js$/.test(file)) {
tests.push(file);
}
}
}
requirejs.config({
// Karma serves files from '/base'
baseUrl: '/base',
paths: {
'jquery': 'node_modules/jquery/src/jquery'
},
map: {
'*': {
'jquery' : '/base/node_modules/jquery/src/jquery.js'
}
},
shim: {
},
// ask Require.js to load these files (all our tests)
deps: tests,
// start test run, once Require.js is done
callback: window.__karma__.start
});
显然,当我以前在shim对象中使用jquery时,这是错误的,它隐藏了一堆404。我现在得到了所有jquery依赖项的404,因为jquery通过相对路径依赖它们-requireJS不会通过相对路径将.js附加到所需的文件中
所以现在我只需要一种方法告诉requirejs将.js附加到依赖项中(而不是强制将其添加到每个jquery文件中),然后希望这能得到解决。有人知道怎么做吗
编辑2:我跳过了中间人,只下载了jquery-2.2.2.min,而不用担心模块版本
我还需要清除其他障碍:在karma.conf.js事件中包含文件的顺序,以及在test-main.js中,显然只有文件名中带有spec的文件被包含为测试。我还需要将所有这些“包含”属性设置为false
最后,在我的例子中,我正在测试的模块是使用一个字符串定义的,该字符串与karma查找路径略有不同。示例:
//addition-functions.js
define('myModules/calculator/addition-functions', [], function () {
在测试文件中:
//test-file.js
define(['jquery', 'myModules/calculator/addition-functions'], function($, addFunctions) {
如果我只这样做,我会在我的模块上安装404,因为它希望它位于apps文件夹中。但是,我不能直接将应用添加到路径中。我必须使用test-main.js中的path变量,如下所示:
requirejs.config({
// Karma serves files from '/base'
baseUrl: '/base',
paths: {
'jquery': 'lib/jquery-2.2.2.min',
'myModules/calculator/addition-functions' : 'apps/myModules/calculator/addition-functions'
},
...
这使问题得以解决。将此标记为已解决。那么这是一个问题还是一个答案???这是否回答了您的问题?