Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我如何才能成功地将jquery包含在带有requireJS的karma中?_Javascript_Jquery_Requirejs_Karma Jasmine - Fatal编程技术网

Javascript 我如何才能成功地将jquery包含在带有requireJS的karma中?

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

我正在尝试编写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 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
中为应用程序文件指定的路径下

  • 如果我取出jquery测试,其他测试将执行并成功
  • 如果我在jquery的
    karma.conf
    文件列表中将“included”属性更改为true,我将得到以下错误:
  • 未捕获错误:不匹配的匿名定义()

  • 如果我试图在
    karma.conf
    中的框架数组中添加'jquery',karma甚至不会启动
  • 如果我试图用一些require的把戏来包装我的测试,比如
    require(['jquery']),function($){
    测试将不会运行,我将得到
  • 执行了0个错误中的0个

  • 我还尝试过使用
    define(function(require){var$=require('jquery');
    ,这给了我另一个
  • 未捕获错误:不匹配的匿名定义()

  • var$=require('jquery')
    导致:
  • 未捕获错误:尚未加载上下文的模块名“jquery:\ u0。请使用require([])

    无论如何,我已经搜索了很多类似的问题和任何解决方案,但我还没能实现。理想情况下,jquery可以通过karma用于我的所有测试,但即使能够在测试中手动要求它,在这一点上也是可以的。此外,没有得到
    无时间戳
    错误太好了,有什么建议吗

    谢谢

    编辑:

    经过多次尝试和错误,我想我已经朝着目标取得了一些进展,尽管我还没有完全达到目标

    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'
    },
    ...
    

    这使问题得以解决。将此标记为已解决。

    那么这是一个问题还是一个答案???这是否回答了您的问题?