首页 文章

grunt jasmine-node测试运行了两次

提问于
浏览
8

我设置了grunt来运行node.js jasmine测试 . 出于某种原因,使用此配置,结果始终显示为测试的两倍 .

这是我的配置:

我正在使用插入咕噜声的jasmine-node .

/spec/some-spec.js

var myModule = require('../src/myModule.js');
describe('test', function(){
     it('works', function(done){
         setTimeout(function(){
             expect(1).toBe(1);
             done();
         }, 100);
     });
});

Gruntfile.js

module.exports = function(grunt) {
    grunt.initConfig({
        jasmine_node: {
            options: {
                forceExit: true
            },
            all: ['spec/']
        }
    });
    grunt.loadNpmTasks('grunt-jasmine-node');
    grunt.registerTask('default', ['jasmine_node']);
};

这导致两个测试运行而不是一个 .

> grunt
Running "jasmine_node:all" (jasmine_node) task
..

Finished in 0.216 seconds
2 tests, 2 assertions, 0 failures, 0 skipped

5 回答

  • 2

    jasmine-node项目已经很老了 . 最新的commit是从2014年7月开始的 . 这个grunt-jasmine-node插件似乎是活跃的,但是对于过时的东西运行似乎有点无意义恕我直言 .

    要使用Jasmine测试CommonJS模块,我建议使用Karma以及karma-jasminekarma-commonjs插件 . 我让你的例子使用以下文件:

    package.json

    {
      "private": "true",
      "devDependencies": {
        "grunt": "^0.4.5",
        "grunt-jasmine-node": "^0.3.1",
        "grunt-karma": "^0.10.1",
        "jasmine-core": "^2.3.4",
        "karma": "^0.12.31",
        "karma-commonjs": "0.0.13",
        "karma-jasmine": "^0.3.5",
        "karma-phantomjs-launcher": "^0.1.4"
      }
    }
    

    karma.conf.js

    module.exports = function(config) {
      config.set({
      basePath: '.',
      frameworks: ['jasmine', 'commonjs'],
      files: [{
            pattern: 'src/**/*.js'
          }, {
            pattern: 'spec/**/*.js'
          }],
    
      preprocessors: {
        'src/**/*.js': ['commonjs'],
        'spec/**/*.js': ['commonjs']
      },
    
      reporters: ['progress'],
    
      browsers: ['PhantomJS']
      });
    };
    

    Gruntfile.js (如果您仍想使用grunt,则为可选项)

    module.exports = function(grunt) {
      grunt.initConfig({
        karma: {
          unit: {
            configFile: 'karma.conf.js',
            options: {
              singleRun: true
            }
          }
        }
      });
      grunt.loadNpmTasks('grunt-karma');
      grunt.registerTask('default', ['karma:unit']);
    };
    

    您还应该全局安装karma命令行运行器,就像您可能使用grunt一样 . npm install -g karma-cli

    从命令行,您可以通过键入 karma start 来启动业力 . 它将运行测试,然后观察您的文件并在每次保存时重新运行它们 . (非常好)

    或者,您可以运行 karma start --single-run 让它只运行一次测试然后退出 . 如果您还更新了Gruntfile,也可以运行 grunt 来运行一次测试 .

  • 5

    我能够重现这种行为 . 这似乎正在发生:

    • 该任务在指定文件夹(在您的情况下为 spec )中查找名称中包含spec的文件 .

    • 然后它会在整个项目的每个文件夹中再次查找名称中包含spec的文件 .

    最终结果是运行两组重叠的测试文件 .

    我尝试将其强制转换为更符合逻辑的行为的第一次尝试是设置 specNameMatcher: null (默认为'spec'),并将文件夹设置为'spec/' . 这导致不运行任何测试,因为显然两个条件(名称和文件夹)必须满足指定文件夹中的文件 . 如果 specNameMatcher 保留默认值,但文件夹中的文件名称中的文件名为“'t have ' spec”,则会出现同样的问题 .

    将文件夹(或'test set'或您想要调用它的任何内容)设置为 [] 的工作原理是什么:

    jasmine_node: {
            options: {
                forceExit: true
            },
            all: []
        }
    

    问题是,如果你在项目中的其他地方有任何其他文件,名称中有'spec',那么它们就会被jasmine误认为是 .

    我认为这种行为是一个错误,它可能应该通过项目的github问题页面报告 .

  • 2
  • 3

    目前最高投票的答案不是解决方案 . 您只需修改与测试匹配的表达式 . 答案如下:

    module.exports = function(grunt) {
    grunt.initConfig({
        jasmine_node: {
            options: {
                forceExit: true
            },
            all: ['spec/*spec.js']
        }
    });
    grunt.loadNpmTasks('grunt-jasmine-node');
    grunt.registerTask('default', ['jasmine_node']);
    };
    

    在这里你可以看到'all'被设置为 *'spec/spec.js' . 这将搜索所有测试 .

    其次,仅仅因为一个项目最近没有提交,并不意味着它“老” . 茉莉花节点很简单 .

  • 0

    我使用grunt-jasmine-node有同样的问题,正如aeryaguzov指出的那样,该项目不再维护 . 切换到grunt-jasmine-node-new为我解决了这个问题 .

    grunt-jasmine-node-new是一个积极维护的grunt-jasmine-node的分支,可以在这里找到:https://www.npmjs.com/package/grunt-jasmine-node-new

相关问题