如果包含在自执行匿名函数中,JavaScript可以是“单元可测试的”

时间:2011-08-17 12:17:39

标签: javascript unit-testing qunit jasmine

正如我多次看到的,一个自执行的匿名函数用于包含整个库。如果例如,如何测试这些库QUnit无法访问匿名函数包装器中的任何内容吗?

2 个答案:

答案 0 :(得分:6)

我同意你不想通过寻找偷偷摸摸的方法对私人方法进行离散测试来执行Backdoor Manipulation

然而,正如你所指出的那样,网络应用程序联盟上的联盟被写成一个巨大的自我执行的泥球,缺乏任何命名或公共API。这是一个完全不同的问题,在许多其他技术堆栈中不太可能遇到这种问题。

TDD为网络提供JavaScript的巨大价值之一就是它迫使您编写至少可以由两方使用的JavaScript:您的网络应用+单元测试。

我用Jasmine玩了几次这个传统的救援游戏:

  1. 如果未命名,请在自动执行的命名方法中包装每个功能块

  2. Characterize具有功能Jasmine规范的方法。我喜欢茉莉花有很多原因,但由于它能够嵌套示例组,所以它在传统救援方面确实具有优势。例如,每当我正在表征的代码具有匿名函数时,通常可以使用嵌套示例组来通过用间谍抓住它并在不同的上下文中调用它来离散地表征该嵌套函数的行为。

  3. 一旦你成为绿色,就开始重构为小而命名良好,组织良好的方法/命名空间

  4. 编写隔离测试以表征这些单位

  5. 吃三明治并思考这些功能测试是否仍然有价值(如果你没有进行任何全栈测试;如果你已经进行了良好的全栈测试,那么它可能过于冗余而无法维护他们)。因为我通常使用Cucumber / Capybara推动开发,所以我认为使用Jasmine编写集成测试没有多大价值。

答案 1 :(得分:2)

您只需对该“公共”功能进行所有测试,例如参见官方jQuery核心test suite

片段:

// Basic constructor's behavior

equals( jQuery().length, 0, "jQuery() === jQuery([])" );
equals( jQuery(undefined).length, 0, "jQuery(undefined) === jQuery([])" );
equals( jQuery(null).length, 0, "jQuery(null) === jQuery([])" );
equals( jQuery("").length, 0, "jQuery('') === jQuery([])" );
equals( jQuery("#").length, 0, "jQuery('#') === jQuery([])" );

您无需访问私有函数来测试公共行为