Unit testing 递增Lua中的os.clock()

Unit testing 递增Lua中的os.clock(),unit-testing,lua,sleep,Unit Testing,Lua,Sleep,摘要:我能让时间(看起来)在我的脚本中流逝而不忙着等待吗?使用os.execute('sleep 1')并不能减少它(而且浪费时间) 详细信息 我有一个在特定时间间隔后工作的。目前,我通过在时间排序列表中插入一个表来安排这项工作。大致: localdelayedwork={} 功能handleLater(数据,延迟秒) 本地delayedItem={data=data,execTime=os.clock()+delaySeconds} 局部i=1 对于_,存在于ipairs(延迟工作)do中 如

摘要:我能让时间(看起来)在我的脚本中流逝而不忙着等待吗?使用
os.execute('sleep 1')
并不能减少它(而且浪费时间)

详细信息
我有一个在特定时间间隔后工作的。目前,我通过在时间排序列表中插入一个表来安排这项工作。大致:

localdelayedwork={}
功能handleLater(数据,延迟秒)
本地delayedItem={data=data,execTime=os.clock()+delaySeconds}
局部i=1
对于_,存在于ipairs(延迟工作)do中
如果existing.execTime>delayedItem.execTime,则中断else i=i+1 end
结束
表.插入(delayedWork,i,delayedItem)
结束
后来我定期检查要做的工作。大致:

函数processDelayedWork()
本地i,最后一个=1,#延迟工作

而我保罗已经回答了这个问题:制作
os.clock
返回你需要的任何东西

我正在添加一个实现,它允许您根据
os.clock
控制时间流逝的速度

do
    local realclock = os.clock
    local lasttime = realclock()
    local faketime = lasttime
    local clockMultiplier = 1
    function setClockMultiplier(multiplier)
        clockMultiplier = multiplier
    end
    function adjustTime(offsetAmount)
        faketime = faketime + offsetAmount
    end
    function os.clock()
        local now = realclock()
        adjustTime((now - lasttime) * clockMultiplier)
        lasttime = now
        return faketime
    end
end

您现在可以调用
setClockMultiplier
来自由地减慢或加快时间的流逝,如
os.clock
所报告的那样。您可以调用
adjustTime
来提前或延迟任意数量的时钟。

为什么不编写自己的时钟函数来实现您想要的功能

do
   local clock = os.clock
   local increment = 0
   os.clock = function(inc)
     increment = increment + (inc or 0)
     return clock()+increment
   end
end
print(os.clock())
os.clock(1)
print(os.clock())

这将打印
0.001 1.001
或类似内容。

“这不是浪费时间的全部原因吗?”,不。如果我可以让脚本认为5秒已经过去并从那一刻开始继续,我不希望每次单元测试都要等待5秒。修改运行时只是为了让单元测试更容易一点似乎有点奇怪。很遗憾,没有更好的解决方案,但是你得到了这个好主意的认可。