我正在创建我的第一个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
非常感谢!
答案 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和其他人)运行测试。