gpt4 book ai didi

javascript - 如何在不污染全局命名空间的情况下公开 javascript 对象进行单元测试

转载 作者:数据小太阳 更新时间:2023-10-29 04:48:32 26 4
gpt4 key购买 nike

我有一个 javascript 自动完成插件,它使用以下类(用 coffeescript 编写):Query、Suggestion、SuggestionCollection 和 Autocomplete。这些类中的每一个都有一个用 Jasmine 编写的相关规范。

插件在模块中定义,例如:

(function(){
// plugin...
}).call(this);

这可以防止类污染全局命名空间,但也可以将它们隐藏在任何测试中(使用 jasmine 的规范,或使用类似 q-unit 的单元测试)。

在不污染全局命名空间的情况下公开 javascript 类或对象以进行测试的最佳方法是什么?

我会用我想出的解决方案来回答,但我希望有更标准的东西。

更新:我尝试的解决方案

因为我是 < 100 xp 的新手,所以我不能在 8 小时内回答我自己的问题。我不会等待,而是添加我在这里所做的事情。

为了规范这些类,我发明了一个名为 _test 的全局对象,我公开了其中的所有类以进行测试。例如,在 CoffeeScript 中:

class Query
// ...

class Suggestion
// ...

// Use the classes

// Expose the classes for testing
window._test = {
Query: Query
Suggestion: Suggestion
}

然后,在我的规范中,我可以揭示我正在测试的类:

Query = window._test.Query

describe 'Query', ->
// ...

这样做的好处是只有 _test 对象被污染,不太可能与该对象的另一个定义发生冲突。不过,它仍然没有我想要的那么干净。我希望有人能提供更好的解决方案。

最佳答案

我认为像 CommonJS 模块系统(例如 brunch 使用的)会起作用。

您可以将代码分成模块,需要它们的部分将通过require 导入它们。唯一被“污染”的部分是由模块管理代码维护的模块映射,与您的 test 对象非常相似。

Autocomplete.coffee

class exports.Query
// ...

class exports.Suggestion
// ...

然后在 Autocomplete.spec.coffee

{Query, Suggestion} = require 'app/models/Autocomplete'

describe 'Query', ->

关于javascript - 如何在不污染全局命名空间的情况下公开 javascript 对象进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8569647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com