grunt jasmine-node测试运行了两次

d-_*_*_-b 8 javascript node.js jasmine gruntjs jasmine-node

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

这是我的配置:

我正在使用插入咕噜声的茉莉花节点.

/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);
     });
});
Run Code Online (Sandbox Code Playgroud)

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']);
};
Run Code Online (Sandbox Code Playgroud)

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

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

Finished in 0.216 seconds
2 tests, 2 assertions, 0 failures, 0 skipped
Run Code Online (Sandbox Code Playgroud)

1.6*_*618 5

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

  1. 该任务在指定的文件夹(spec在您的情况下)中查找名称中包含spec的文件.
  2. 然后,它会在整个项目的每个文件夹中再次查找名称中包含spec的文件.

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

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

什么的工作就是设置文件夹(或"测试集"或任何你想将它命名)到[]:

    jasmine_node: {
        options: {
            forceExit: true
        },
        all: []
    }
Run Code Online (Sandbox Code Playgroud)

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

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


joh*_*ase 2

jasmine -node项目相当古老。最新提交是 2014 年 7 月。grunt-jasmine-node插件似乎很活跃,但恕我直言,针对即将过时的东西运行似乎有点毫无意义。

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

包.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"
  }
}
Run Code Online (Sandbox Code Playgroud)

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']
  });
};
Run Code Online (Sandbox Code Playgroud)

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']);
};
Run Code Online (Sandbox Code Playgroud)

您还应该全局安装 karma 命令行运行程序,就像您对 grunt 所做的那样。 npm install -g karma-cli

在命令行中,您可以通过键入 来启动 karma karma start。它将运行测试,然后监视您的文件并在每次保存时重新运行它们。(很不错)

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