【问题标题】:How To Test a Grunt Plugin如何测试 Grunt 插件
【发布时间】:2013-12-31 17:43:51
【问题描述】:

我正在创建我的第一个 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 插件要做什么? (题外话,我知道)
  • 我的插件将使用站点地图 url ping google 和 bing。非常非常简单,但我想通过测试学习如何正确地做到这一点:)
  • 你找不到你的函数的原因是你需要require这个函数的文件。您还需要通过模块定义导出它。 p=require('myplugin');p.outsideFunction()

标签: javascript gruntjs mocha.js


【解决方案1】:

理想情况下,您希望测试功能。你的 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 和其他)运行您的测试。

【讨论】:

  • 太好了,这有点道理。我要试一试。对您的附注进行了一些跟进: - 出于某种原因,我被 grunt-mocha-test 所吸引,所以这就是我选择的。谢谢你提到这一点。 - 我使用带有 jshint 插件的 VIM...切换到 jshint grunt 任务有什么好处吗?附言我会在我开始工作的那一刻标记你的答案。再次感谢!
  • 与 Grunt 的 watch 任务和 JSHint + Mocha 有一些协同作用,但如果它内置在你的编辑器中,那就没有必要了;话虽如此,如果您计划开源,那么拥有该设置对贡献者来说更好,因为每个人都使用相同的设置进行 linting。有些人在自定义规则方面比其他人更严格,但我想这确实是一种偏好。两者都用真的没坏处! :-)
  • 如果您正在寻找测试覆盖率,并不能真正回答这个问题...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2013-10-06
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
相关资源
最近更新 更多