Freezer 是一个库,允许您的 Swift 测试通过模拟 NSDate
类穿越时间。
调用 Freezer.start()
一次后,对 NSDate()
或 NSDate(timeIntervalSinceNow: secs)
的所有调用都将返回被冻结的时间。
freeze(NSDate(timeIntervalSince1970: 946684800)) {
print(NSDate()) // 2000-01-01 00:00:00 +0000
}
let freezer = Freezer(to: NSDate(timeIntervalSince1970: 946684800))
freezer.start()
print(NSDate()) // 2000-01-01 00:00:00 +0000
freezer.stop()
Freezer 会将您移动到指定的时间点,但那时时间将持续流逝。
timeshift(NSDate(timeIntervalSince1970: 946684800)) {
print(NSDate()) // 2000-01-01 00:00:00 +0000
sleep(2)
print(NSDate()) // 2000-01-01 00:00:02 +0000
}
Freezer 允许执行嵌套冻结/移动
freeze(NSDate(timeIntervalSince1970: 946684800)) {
freeze(NSDate(timeIntervalSince1970: 946684000)) {
freeze(NSDate(timeIntervalSince1970: 946684800)) {
print(NSDate()) // 2000-01-01 00:00:00 +0000
}
print(NSDate()) // 1999-12-31 23:46:40 +0000
}
print(NSDate()) // 2000-01-01 00:00:00 +0000
}
只需将 freezer.swift 复制到您的 Xcode 项目中,并将其添加到测试目标中。除非 Apple 通过更改 NSDate
的内部实现而导致问题,否则此方式也很好。
MIT