如何在javascript中测试var函数
How to test a function in var in javascript
给定如下代码段,从钢筋js
var RL = {};
(function(global) {
var sampleWeighted = function(p) {
var r = Math.random();
var c = 0.0; // cumulative prob
for(var i=0, n=p.length; i<n; i++) {
c += p[i];
if (c >= r) { return i; }
}
// assert(false) may happen if sum(p) < 1;
assert(false, 'wtf');
};
// many content omitted
...
})(RL);
export default RL;
我如何访问sampleWeighted并对其进行测试?
import RL from './rl.js';
it('sampleWeighted', () => {
expect(RL.sampleWeighted([0.5, 0.5])).toEqual(1);
});
但是它报错了
FAIL src/lib/rl.test.js
✕ sampleWeighted (1ms)
● sampleWeighted
TypeError: _rl.RL.sampleWeighted is not a function
at Object.<anonymous> (src/lib/rl.test.js:7:46)
at process._tickCallback (internal/process/next_tick.js:103:7)
我是新的javascript测试。目前,我正在使用create-react-app来设置测试框架。那么,测试上述函数的正确方法是什么呢?如果你碰巧了解sampleWeighted
是做什么的,也请随意评论。
sampleWeighted在您的IIFE
(立即函数调用语法)的闭包中
这种方式你可以保持你的方法私有像private public
在Java中,注意你已经传递全局是RL,你可以把它作为你的命名空间,如果你想调用sampleWeighted,你需要将sampleWeighted附加到RL
,
...
RL.sampleWeighted = function() {}
...
在闭包中编写代码,使我们的测试代码能够访问我们关心的私有函数,但是当我们部署到生产环境中时删除这些代码。在这里,您可以准确地编写代码,您希望它在发布时呈现的样子,然后添加您需要的任何桥接代码,以公开您想要测试的部分。
如果你正在使用构建系统,你可以这样做
var RL = {};
(function(global) {
var sampleWeighted = function(p) {
var r = Math.random();
var c = 0.0; // cumulative prob
for(var i=0, n=p.length; i<n; i++) {
c += p[i];
if (c >= r) { return i; }
}
// assert(false) may happen if sum(p) < 1;
assert(false, 'wtf');
};
var api = {
bar: function() {
// public function `bar` returned from closure
return "bar"
}
};
/* test-code */
api._foo = foo
/* end-test-code */
return api
})(RL);
export default RL;
然后你可以使用"grunt-strip-code"
npm install grunt-strip-code --save-dev
然后在你的Gruntfile中启用它:
grunt.loadNpmTasks('grunt-strip-code');
grunt.initConfig({
strip_code: {
options: {
start_comment: "test-code",
end_comment: "end-test-code",
},
your_target: {
// a list of files you want to strip code from
src: "dist/*.js"
}
}
})
grunt.registerTask("test", [
"concat",
"jshint",
"jasmine"
])
grunt.registerTask("deploy", [
"concat",
"strip-code",
"jshint",
"uglify"
])
参考- https://philipwalton.com/articles/how-to-unit-test-private-functions-in-javascript/
在您的IIFE中,您没有将sampleWeighted
附加到传入对象(全局)。所以一定要在你的生活中做如下的事情:
global.sampleWeighted = sampleWeighted;
同样,在您的测试文件中,您需要使用:
访问该函数:RL.sampleWeighted
相关文章:
- 模糊事件的Javascript测试
- 我的单元测试选项是什么
- 控制台返回var不是't定义,但它是
- 测试索引值是否等于某个数字的倍数
- 从var向代码隐藏函数传递值
- 如何通过引用var Using DataTables来进行分页或排序
- 在localhost Dev Box上测试JSONP请求的最佳方式
- jQuery语法添加了var
- 测试数组中每个项的内容
- 如何将具有文本类型值的var放入jQuery函数中
- 测试Angular Service解决错误回调中的promise
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 当var==0时,我如何显示一个警报
- 使用Jest测试React Native应用程序
- 测试变量存在性的Javascript多重赋值:var obj=obj||{}
- 是否可以使用 for 循环进行 DRY 量角器测试?*VaR 即将出现未定义*
- 如何在javascript中测试var函数
- 如何获得变量警报(测试)从var测试成功ajax
- 是否有可能在javascript中测试,如果var包含一个图像节点,如果它被加载
- 使用“var undefined”来测试未定义有什么问题吗?