我有一个函数,不需要超过每10秒调用一次,每次调用该函数时,我都会将计时器重置为10秒。
class MyClass {
var timer:Timer?
func resetTimer() {
self.timer?.invalidate()
self.timer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: false) {
(timer) -> Void in
self.performAction()
}
}
func performAction() {
// perform action, then
self.resetTimer()
}
}
我想测试一下调用performAction()是否会手动将计时器重置为10秒,但我似乎找不到任何好的方法。存根resetTimer()让我感觉测试并没有真正告诉我足够的功能。我错过了什么吗?
XC测试:
func testTimerResets() {
let myObject = MyClass()
myObject.resetTimer()
myObject.performAction()
// Test that my timer has been reset.
}
谢谢!
4条答案
按热度按时间ymzxtsji1#
如果希望等待计时器触发,仍然需要使用expectations(或Xcode 9新的异步测试API)。
问题是你要测试的究竟是什么,你可能不想只测试计时器触发了,而是想测试计时器的处理程序实际上在做什么(假设你有一个计时器来执行一些有意义的事情,所以这就是我们应该测试的)。
WWDC 2017视频Engineering for Testability提供了一个很好的框架来思考如何为单元测试设计代码,这需要:
那么,测试的输入是什么?更重要的是,输出是什么?在单元测试中,您希望测试哪些Assert?
该视频还展示了一些实际示例,说明如何通过明智地使用以下内容重构代码以实现此结构:
如果不知道计时器实际在做什么,很难给出进一步的建议。也许你可以编辑你的问题并澄清一下。
qaxu7uf22#
很高兴你找到了解决方案,但回答了标题中的问题;
要测试计时器是否真正工作(即运行和调用回调),我们可以做如下操作:
当有这样的课程时:
dsf9zpds3#
首先,我会说我不知道你的对象是如何工作的,当你没有任何名为
refreshTimer
的成员。测试(注解中的解释)
这不是最好的方法,但是它给了你一个关于你应该如何实现这一目标的观点或流程:)
wixjitnu4#
我最后存储了原始Timer的fireDate,然后检查了执行操作后新的fireDate是否设置为比原始fireDate晚的值。