如何测试Grunt插件

cou*_*ing 2 javascript mocha.js gruntjs

我正在创建我的第一个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";
    }

  });

};
Run Code Online (Sandbox Code Playgroud)

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

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

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

1) testOutsideOfTask should do something:
ReferenceError: testOutsideOfTask is not defined
Run Code Online (Sandbox Code Playgroud)

非常感谢!

Ben*_*Ben 5

理想情况下,您想测试功能。您的Grunt插件最终应该作为更多抽象方法的包装,这些抽象方法可以实现您想要的但不一定与Grunt的工作方式相关;然后为实际的插件在每个文件上运行这些方法,记录一些输出等。类似这样的内容:

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

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

因此,在该伪代码中,您将要实际测试doSomeMethod功能,而不是Grunt注册了任务或登录了CLI。这已经被很好的测试了。

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

我自己的模块之一更特定于Grunt,但是针对该模块的测试着重于模块的实际功能。您可以在这里查看:

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

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