如何测试Grunt插件

时间:2013-12-31 17:43:52

标签: javascript gruntjs mocha

我正在创建我的第一个Grunt插件。我真的想在开发时练习测试我的插件。我已选择mocha作为我的测试框架,因为它似乎很受欢迎,并设置我的gruntfile以自动观察测试文件何时被更改并运行它们。这一切看起来都不错。

但是,我没有找到很多关于如何实际测试Grunt插件的文档。我查看了大约十几个不同的grunt插件的代码,特别是contrib的插件,它们对我来说没有多大意义。

当我尝试测试我的代码时,我试图将其分解为非常具体的功能。所以,这是一个插件的基本结构,其中包含一个函数。

'use strict';

function testOutsideOfTask(){
  return "i am outside";
}

module.exports = function(grunt) {
  grunt.registerMultiTask('example_task', 'I do a thing.', function() {

    function testInsideOfTask(){
      return "i am inside";
    }

  });

};

我已经明确地包含了几种方法,以确保我的测试正常,但事实并非如此。这两种方法似乎都不可访问......我如何才能访问这两种方法进行测试?这是我拥有的摩卡测试。

var grunt = require('grunt');
var assert = require("assert");

describe('testOutsideOfTask', function() {
  it('do something', function() {
    assert.equal("i am outside", testOutsideOfTask());
  });
});

describe('testInsideOfTask', function() {
  it('do something', function() {
    assert.equal("i am inside", testInsideOfTask());
  });
});

他们都返回这样的东西。所以,不知怎的,它只是无法访问这些函数,但是,当我查看其他测试示例时,它们似乎并没有特别要求正在测试的文件...例如https://github.com/gruntjs/grunt-contrib-clean/blob/master/test/clean_test.js

1) testOutsideOfTask should do something:
ReferenceError: testOutsideOfTask is not defined

非常感谢!

1 个答案:

答案 0 :(得分:4)

理想情况下,您希望测试功能。你的Grunt插件应该最终成为更抽象的方法的包装器,这些方法可以做你想要的但不一定与Grunt的工作方式有关;然后对于实际的插件,你在每个文件上运行这些方法,记录一些输出等。像这样:

var lib = require('./lib.js');

module.exports = function(grunt) {
    grunt.registerMultiTask('test', function() {
        lib.doSomeMethod();
        grunt.log.ok('Something happened');
    });
}

因此,在该伪代码中,您可能希望实际测试doSomeMethod函数,而不是Grunt注册任务或登录到CLI。这已经过很好的测试了。

许多Grunt插件以这种方式工作,实际上很多是现有节点模块的包装器。例如,grunt-recess是twitter / recess的包装器:

我自己的一个模块更具有Grunt特性,但其测试主要集中在模块的实际功能上。你可以在这看看:

https://github.com/ben-eb/grunt-available-tasks/blob/master/test/lib/filterTasks.test.js

我也在测试摩卡。我建议您使用grunt-mocha-test通过Grunt(以及JSHint和其他人)运行测试。