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