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

Asi*_*pas 11 javascript unit-testing qunit jasmine

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

Jus*_*rls 6

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

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

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

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

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

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

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

  4. 编写隔离测试来表征这些单元

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


Raz*_*zor 2

您只需对“公共”函数进行所有测试,例如,请参阅官方 jQuery 核心测试套件

分段:

// 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([])" );
Run Code Online (Sandbox Code Playgroud)

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