gpt4 book ai didi

javascript - 创建可单元测试的闭包的最佳模式?

转载 作者:行者123 更新时间:2023-11-30 16:02:48 26 4
gpt4 key购买 nike

鉴于此:

var closure = (function() {
var some_variable;
var ret = {};

function some_internal_function() {
return some_variable;
};

function init() {
some_variable = document.getElementById("canvas");
}

ret.some_internal_function = some_internal_function;

return ret;
}());

我希望能够在单元测试期间将 some_variable 转换为模拟对象。但这似乎是不可能的。 There used to be a work around with eval() ,但这似乎不再可能了。

我假设我必须劫持我的 init() 函数来制作我想要的模拟,但这似乎与单元测试理念背道而驰,因为我基本上依赖于执行另一个函数来指示我要测试的函数的行为!

我看到一些代码在函数执行期间传递一个可选的上下文,我认为这与测试/获取内部变量有关。

我想我可以 fork 一个新的节点进程,node -e closure.toString(),将字符串修改为 var some_variable = {};//模拟对象,附加一个方法来返回值(console.log(closure.some_internal_function())),将结果通过管道返回到我的主进程并执行 assert() 与 qunit。但这似乎是在试图成为英雄,而应该有更好的方法(如果有什么比 this way 更容易的话 ><)。

有没有更好的方法?测试这类事情的最佳模式是什么?

最佳答案

更好的方法是不使用匿名模块模式。请考虑以下事项:

var closure = aNameThatConveysWhatYourThingIs(document.getElementById("canvas"));

function aNameThatConveysWhatYourThingIs(some_variable) {
var ret = {};

function some_internal_function() {
return some_variable;
};

ret.some_internal_function = some_internal_function;

return ret;
}

这不需要特技来实现 dependency injection ,这就是您正在努力解决的问题。

然后,您可以在测试中简单地调用具有模拟依赖项的函数,以便访问并断言正在操作的状态。


使用匿名模块模式你:

  • 获取依赖项而不是请求它们。
  • 将模块中的代码与其父范围紧密耦合。

导致:

  • 很难控制代码操纵的状态,您必须聪明才能做到这一点,而不仅仅是对此提供支持。
  • 很难将代码与其编写的上下文分开。

这些是避免匿名模块模式固有的可测试性的特征。使用它似乎不符合您对代码的期望。

关于javascript - 创建可单元测试的闭包的最佳模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37453147/

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