使用setTimeout测试IIFE
Testing IIFE with setTimeout
测试用setTimeout
:递归调用自己的IIFE(立即调用函数表达式)的最佳方法是什么
(function myFuncToBeTested() {
// Code to be tested
...
setTimeout(myFuncToBeTested, timeout) // timeout should be checked
})()
我找到了以下解决方案,它用own
存根替换了全局setTimeout
函数。这有以下问题:
// Saving original setTimeout. This should be restored in test cleanup
originalSetTimeout = global.setTimeout
// Replace with function
global.setTimeout = function setImmediate(myFunc, interval) {
// FIXME: This function now always called
// Save interval to be tested
savedInterval = interval
}
这个函数可以变成一个对象吗?
var myObject = (function(){
function start(){
myFuncToBeTested();
setTimeout(start, 10);
return this;
}
function myFunctToBeTested(){
//Code to be tested
}
return {
start: start,
myFuncToBeTested: myFuncToBeTested
}
})().start();
然后你可以使用你选择的测试框架进行测试:
assert( myObject.myFuncToBeTested() == expectedValue );
我想在arklord47的答案和您使用存根setTimeout
的实验之间提出一个混合解决方案。像你这样的IIFE本质上很难测试,因为你没有留下任何方法来检查它是否被调用。您可以修改您的API如下:
var repeater = {
start: function () {
this.func();
setTimeout(this.start.bind(this), timeout);
},
func: function () {
// code to be tested
}
};
然后你的测试可以看起来像这样(由于你标记了sinon,我已经使用了它,特别是它的假计时器API,它将允许你检查你的间隔功能):
// setup
var clock = sinon.useFakeTimers();
var spy = sinon.spy(repeater, 'func');
// test
repeater.start();
assert(spy.calledOnce);
// advance clock to trigger timeout
clock.tick(timeout);
assert(spy.calledTwice);
// advance clock again
clock.tick(timeout);
assert(spy.calledThrice);
// teardown
clock.restore();
spy.restore();
相关文章:
- 模糊事件的Javascript测试
- 我的单元测试选项是什么
- 测试索引值是否等于某个数字的倍数
- IIFE中的函数引用不可用
- 在localhost Dev Box上测试JSONP请求的最佳方式
- 测试数组中每个项的内容
- 测试Angular Service解决错误回调中的promise
- 使用Jest测试React Native应用程序
- 为函数代码编写测试
- 如何在Angular单元测试中从另一个控制器的rootScope将方法添加到rootScope中
- 如何使用JS/nightwatchjs并行运行多个测试
- 使用量角器的当前url单元测试的getTitle
- 茉莉花宝石-耙茉莉花:ci dons't运行测试
- JavaScript滚动脚本-在测试中激发,而不是在开发站点上
- AngularJS指令单元测试中未定义的函数
- 一个密码测试程序,如果存在空格,它会提醒用户
- 角度指令测试在包装在 IIFE 中后失败
- 在茉莉花测试中访问 IIFE
- 使用setTimeout测试IIFE
- 我怎样才能测试“;私人的“;IIFE的方法