grunt jasmine-node测试运行了两次

时间:2015-05-08 07:16:07

标签: javascript node.js gruntjs jasmine jasmine-node

我设置了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 个答案:

答案 0 :(得分:5)

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

  1. 该任务会查找指定文件夹(在您的案例中为spec),以查找名称中包含 spec 的文件。
  2. 然后它会在整个项目的每个文件夹中查找名称中包含 spec 的文件。
  3. 最终结果是运行两组重叠的测试文件。

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

    的工作原理是将文件夹(或'测试集'或任何您想要调用的内容)设置为[]

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

    问题在于,如果你在项目的其他地方有任何其他文件,那么' spec'在名称中,他们被误认为是茉莉花的测试。

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

答案 1 :(得分:3)

答案 2 :(得分:2)

jasmine-node项目已经很久了。最新的commit是从2014年7月开始的。grunt-jasmine-node插件似乎处于活动状态,但针对过时的东西运行似乎有点无意义恕我直言。

要使用Jasmine测试CommonJS模块,我建议使用Karmakarma-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来运行测试一次。

答案 3 :(得分:2)

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

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']);
};

您可以在此处看到“全部”设置为 *'spec / spec.js' 。这将搜索所有测试。

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

答案 4 :(得分: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