【问题标题】:how to unit test internal functions in jquery plugin?如何在 jquery 插件中对内部函数进行单元测试?
【发布时间】:2011-07-26 08:55:38
【问题描述】:

在一个 jQuery 插件中我创建了辅助函数,像这样

(function($) {

  var someHelperFunction = function(s, d) {
    return s*d;
  }
  var someOtherHelperFunction = function(s) {
    return s*2;
  }

// here goes the normal plugin code

})(jQuery);

现在我想从外部调用 someHelperFunction,以便能够对其进行单元测试, 这有可能吗?

【问题讨论】:

  • 由于无法从外部访问方法,所以无法访问。

标签: javascript jquery unit-testing jquery-plugins


【解决方案1】:

根据this related question,我想说只是测试外部接口。

但是,如果您必须单独测试这些方法,则必须在部署上下文之外将它们的“副本”作为内部方法进行测试。换句话说,创建一个客户端代码无法访问它们的对象,然后在预处理中将这些版本与您的外部脚本拼凑在一起。听起来工作量很大,但是,嘿,这就是隐藏方法的重点,对吧? (使它们无法访问。)

【讨论】:

    【解决方案2】:

    如果内部函数需要测试,这是一个很好的指标,表明它们可能应该位于某个单独的模块中,并作为依赖项注入并在您的对象公共接口实现中使用。这是更“可测试”的方式。

    var myActualImplementationTestTheHellOutOfMe = function(s, d) {
    
        return s*d;
    
    }
    
    (function($, helper) {
    
      var someHelperFunction = function(s, d) {
        return helper(s, d);
      }
      var someOtherHelperFunction = function(s) {
        return s*2;
      }
    
    // here goes the normal plugin code
    
    })(jQuery, myActualImplementationTestTheHellOutOfMe);
    

    【讨论】:

      【解决方案3】:

      您可能还想考虑 JavaScript 文档测试。我知道有两种实现方式:Ian Bicking 的 doctest.js 和我自己的 doctest

      【讨论】:

      • 我试图权衡每个库的优缺点,但它们看起来非常相似。作为 doctest 的作者 - 你能简单介绍一下吗?我的用例是将单元测试添加到white-space,它没有公共 api,需要测试 HTML 固定装置和 document.readyState。
      • 首先,文档测试允许测试使用示例,确保它们保持最新。 Doctests 真正用于测试文档,而不是代码。其次,文档测试适用于pure functions,但不适用于基于回调的代码。我建议使用专门的测试框架。
      • 我真正喜欢 doctest 的地方在于,我不必为了测试而人为地创建公共 API。据我了解,我可以在闭包内编写方法/函数文档,并且仍然允许访问单元测试。我想纯函数的限制对我来说是一个交易破坏者,因为我真正测试的是浏览器行为。
      【解决方案4】:

      帮助程序在插件内部,这是一个匿名函数,您无法访问其中声明的变量。
      如果要测试它,请将 var 关键字放在函数前面。这会将函数声明为全局函数(将它们附加到窗口对象),使它们能够在窗口范围内可见(通过调用 someHelperFunctionwindow.someHelperFunction)。
      所以,为了测试:

      (function($) {
          someHelperFunction = function(s, d) {
              return s*d;
          }
          someOtherHelperFunction = function(s) {
              return s*2;
          }
           // here goes the normal plugin code
      })(jQuery);
      

      测试结束后,再次添加var关键字。

      更新
      我认为更好的方法是将您的可测试函数分组到一个对象中 - 并构造一个 api。然后,根据相同的原则,您可以使该 api 在全局范围内可见或不可见:

      (function($, global) {
          someHelperFunction = function(s, d) {
              return s*d;
          }
          someOtherHelperFunction = function(s) {
              return s*2;
          }
      
          var api = {
              someHelperFunction: someHelperFunction,
              someOtherHelperFunction: someOtherHelperFunction
          };
      
          // decide whether you want to expose your api or not 
          if(makeGlobal) {
              global.api = api;
          }
      })(jQuery, this);
      

      【讨论】:

      • 不要使用全局变量来测试你的私有函数。这不是一个好的答案,因为它支持不良做法。
      【解决方案5】:

      看看qunit,一个 JavaScript 单元测试库

      【讨论】:

      • 这与一般测试无关。它是关于测试本地方法。
      • 哎呀,对不起..说得太快了。自我提醒:输入前请仔细阅读
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      相关资源
      最近更新 更多