【问题标题】:grunt jasmine-node tests are running twicegrunt jasmine-node 测试运行两次
【发布时间】:2015-07-19 00:33:49
【问题描述】:

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

这是我的配置:

我正在使用 jasmine-node 插入 grunt。

/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

【问题讨论】:

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


    【解决方案1】:

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

    1. 任务在指定文件夹(在您的情况下为spec)中查找名称中带有 spec 的文件。
    2. 然后它会再次在整个项目的 every 文件夹中查找名称中带有 spec 的文件。

    最终结果是要运行 2 组重叠的测试文件。

    我第一次尝试将其强制为更合乎逻辑的行为是设置specNameMatcher: null(默认为'spec'),并将文件夹设置为'spec/'。这导致没有运行测试,因为显然必须满足指定文件夹中的文件的两个条件(名称和文件夹)。如果 specNameMatcher 保留默认值,但文件夹中的文件名称中没有“spec”,您会遇到同样的问题。

    所做的工作是将文件夹(或“测试集”或任何您想要的名称)设置为[]

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

    问题是,如果您在项目的其他位置有任何个其他文件,名称中包含“spec”,它们将被误认为是 jasmine 的测试。

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

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 究竟是什么让你相信这个项目已经“死”了?
      【解决方案3】:

      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 来运行一次测试。

      【讨论】:

        【解决方案4】:

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

        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'。这将搜索所有测试。

        其次,仅仅因为一个项目最近没有提交,并不意味着它是“旧的”。 jasmine-node 很稳定。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2014-09-02
            • 2016-06-13
            • 2012-11-16
            • 1970-01-01
            • 1970-01-01
            • 2016-03-08
            • 2011-09-04
            • 2019-04-05
            • 1970-01-01
            相关资源
            最近更新 更多