单元测试有状态 RequireJS 模块的模式
Pattern for unit testing stateful RequireJS modules
假设我有一个 RequireJS 模块,我的应用程序中只有一个实例(假设它执行异步操作并向其传递回调(:
// modules/myModule
define(function(){
var module = function(){
var self = this;
self.runSomething(){
console.log("hello world");
};
};
return new module();
});
我想对此模块的实例进行单元测试,我发现自己以这种方式构建模块:
// modules/myModule
define(function(){
return function(){
var self = this;
self.runRouting(){
console.log("hello world");
};
};
});
// modules/myModuleInstance
define(["modules/myModule"], function(myModule){
return new myModule();
});
这为我提供了一些没有附加状态的东西,然后我可以从我的单元测试中戳出来,所以在我的单元测试中,我从不引用modules/myModuleInstance
,只引用modules/myModule
,我每次都为每个测试构建它。 然后,应用程序引用modules/myModuleInstance
。
这感觉像是一种反模式。 我讨厌在那里有额外的"模块实例"部分。 我知道单元测试中的设置和拆卸方法,并且可以以这种方式维护实例,但是在目睹了 C# 在尝试对大量单例进行单元测试时会发生什么,在单元测试之间摆弄状态是我真正想要避免的事情,尤其是使用动态语言。
在这种情况下,人们通常会怎么做?
在Luke McGregor的评论之后,很明显我在第一个代码片段中的内容很好。 使用 testr.js我可以定义一个运行测试的模块,如下所示:
// tests/myModuleTests
define(["modules/myModule"], function(myModule){
var instanceOfModule = testr(myModule);
// run some tests
var anotherInstanceOfModule = testr(myModule);
// run some other tests
});
相关文章:
- Javascript,访问一个主要对象模块模式中的每个对象
- 模块模式和这个
- 显示模块模式在Knockout中设置模型的新实例
- Javascript中的模块模式和揭示模块模式是否仅在创建API时有用;s
- 用于多个选项卡和模块化的knockoutjs设计模式
- JavaScript模块模式-如何在使用对象/函数之前激发构造函数/init函数
- TypeScript代码类似于揭示模块模式结构
- 为什么在javascript中的模块模式中实现Lazy函数时范围会发生变化
- JavaScript:模块模式差异
- 显示模块模式中的私有成员
- 如何将window.setTimeout与javascript和模块模式一起使用
- j查询模块模式未命名 |如何访问“$”
- 挖空和显示模块模式的数据绑定问题
- 传递参数时如何避免模块模式中的 getter/setter 函数
- 将变量传递给 Javascript 模块化模式方法
- JavaScript 模块模式给出了意想不到的结果
- 从模块模式开始
- 试图通过模块模式在DOM元素上实现change()事件
- 揭示模块模式、KnockoutJS和CoffeeScript
- JavaScript 设计模式:模块模式和揭示模块模式之间的区别