JavaScript可以是“吗?”;“可测试单元”;如果包装在自动执行匿名函数中

JavaScript可以是“吗?”;“可测试单元”;如果包装在自动执行匿名函数中,javascript,unit-testing,qunit,jasmine,Javascript,Unit Testing,Qunit,Jasmine,正如我多次看到的,一个自动执行的匿名函数用于包含整个库。如果QUnit无法访问匿名函数包装器中的任何内容,那么如何测试这些库呢?您只需对该“公共”函数执行所有测试,例如,请参见官方jQuery核心 片段: // Basic constructor's behavior equals( jQuery().length, 0, "jQuery() === jQuery([])" ); equals( jQuery(undefined).length, 0, "jQuery(undefined) =

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

您只需对该“公共”函数执行所有测试,例如,请参见官方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([])" );

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

我同意您不想通过寻找秘密的方法来离散测试私有方法来执行

然而,正如您所指出的,一个接一个的web应用程序被编写成一个巨大的自动执行的泥球,没有任何命名或公共API。这是一个完全不同的问题,在许多其他技术堆栈中不太可能遇到

TDD’ing JavaScript的一个巨大价值在于,它迫使您编写至少可供两方使用的JavaScript:您的web应用程序+您的单元测试

我已经和Jasmine玩过几次这个传统救援游戏:

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

  • 这些方法具有功能规范。我喜欢茉莉花有很多原因,但它确实在legacy rescue中击败了qunit,因为它能够嵌套示例组。例如,每当我描述的代码有一个匿名函数时,通常可以使用嵌套的示例组来离散地描述该嵌套函数的行为,方法是使用间谍捕捉该函数并在不同的上下文中调用它

  • 一旦你是绿色的,开始重构成小的、命名良好的、组织良好的方法/名称空间

  • 编写独立的测试来描述这些单元

  • 吃一块三明治,思考这些功能测试是否仍然有价值(如果你没有任何完整的堆栈测试,那么它们很可能是有价值的;如果你已经有了很好的完整的堆栈测试,那么它们可能太过冗余,无法保证维护它们)。因为我通常用/来驱动开发,所以我认为用Jasmine编写集成测试没有多大价值

  • 您可以处理代码(并对其进行测试),然后使用“构建”脚本将其包装到包装器中。IE
    函数(窗口,文档,未定义){…}(窗口,文档)
    其中
    是您的代码。只要将代码连接起来就足够了。