我正在创建我的第一个 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";
}
});
};
我明确地包含了一些方法来确保我的测试有效,但事实并非如此。这两种方法似乎都无法访问...我如何访问它们进行测试?这是我的 Mocha 测试。
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
非常感谢!
最佳答案
理想情况下,您想要测试功能。您的 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
我也在用 Mocha 进行测试。我建议您使用grunt-mocha-test通过 Grunt(以及 JSHint 和其他)运行测试。
关于javascript - 如何测试 Grunt 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20861251/