我正在创建我的第一个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
非常感谢!
理想情况下,您想测试功能。您的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的包装:
https://github.com/sindresorhus/grunt-recess
https://github.com/twitter/recess
我自己的模块之一更特定于Grunt,但是针对该模块的测试着重于模块的实际功能。您可以在这里查看:
https://github.com/ben-eb/grunt-available-tasks/blob/master/test/lib/filterTasks.test.js
我也在与Mocha进行测试。我建议您使用grunt-mocha-test通过Grunt(以及JSHint和其他)运行测试。