正如我多次看到的,一个自动执行的匿名函数用于包含整个库。如果 QUnit 无法访问匿名函数包装器内的任何内容,如何测试这些库?
2 回答
我同意您不想通过寻找偷偷摸摸的方法来离散测试私有方法来执行后门操作。
然而,正如您所指出的,网络应用程序的联盟被编写成一个巨大的自我执行的泥球,没有任何命名或公共 API。这是一个完全不同的问题,在许多其他技术堆栈中不太可能遇到。
为 Web 使用 TDD 的 JavaScript 的巨大价值之一是它迫使您编写至少可供两方使用的 JavaScript:您的 Web 应用程序 + 您的单元测试。
我和 Jasmine 玩过几次这个传统的救援游戏:
如果未命名,则将每个功能块包装在一个自执行的命名方法中
使用功能性Jasmine规格来表征这些方法。我喜欢 Jasmine 有很多原因,但它确实在 legacy rescue 中击败了 qunit,因为它能够嵌套示例组。例如,每当我描述的代码具有匿名函数时,通常可以使用嵌套示例组来离散地描述该嵌套函数的行为,方法是用间谍抓住它并在不同的上下文中调用它。
一旦你是绿色的,就开始重构为小的、命名良好、组织良好的方法/命名空间
编写隔离测试来表征这些单元
吃个三明治,思考一下这些功能测试是否仍然有价值(如果你没有任何全栈测试,它们可能是;如果你已经有很好的全栈测试,那么它可能太多余而无法保证维护它们)。因为我通常使用Cucumber / Capybara推动开发,所以我认为使用 Jasmine 编写集成测试没有多大价值。
您只需对该“公共”功能进行所有测试,例如查看官方 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([])" );
您无需访问私有函数即可测试公共行为