我有一个单元测试,看起来像这样:为什么我的简单日期计算有时在Swift 3.1中失败?
func testManyYearsAgo() {
for year in 2...77 {
let earlierTime = calendar.date(byAdding: .year, value: 0 - year, to: now)
// print(year)
// print(dateDifference.itWasEstimate(baseDate: now, earlierDate: earlierTime!))
XCTAssertEqual(dateDifference.itWasEstimate(baseDate: now, earlierDate: earlierTime!), "\(year) years ago")
}
}
now
定义上涨刚才Date()
calendar
是Calendar.current
它的测试类,它看起来是这样的:
class DateDifference {
func itWasEstimate(baseDate: Date, earlierDate: Date) -> String {
let calendar = Calendar.current
let requestedComponent: Set<Calendar.Component> = [ .year, .month, .day, .hour, .minute, .second]
let timeDifference = calendar.dateComponents(requestedComponent, from: baseDate, to: earlierDate)
if timeDifference.year! < 0 {
if timeDifference.year! == -1 {
return "Last year"
} else {
return "\(abs(timeDifference.year!)) years ago"
}
}
return ""
}
}
当我运行单元测试时,我通常(但不是总是)得到如下错误:
个XCTAssertEqual failed: ("30 years ago") is not equal to ("31 years ago")
这些错误通常开始后的年值超过12
如果我取消了打印语句,它工作得很好,无论多少次,我运行的代码。
这使我相信也许有一些奇怪的异步事情正在进行,但我确定无法通过查找来判断。我对快速开发比较陌生,所以我可能会缺少一些基本的东西。
现在已经很晚了,我可能只是忽略了一些显而易见的东西。 –
我将你的代码复制到操场上,我也看到了间歇性结果。有时它可以正常工作,有时会显示一些年份的1年差异。很奇怪。顺便说一句 - 你只需要使用'.year'作为日期组件的列表。 – rmaddy
也可以重现。我*假设*来自日历计算中的四舍五入错误(“Date”在内部存储具有亚秒级分辨率的double)。在进行计算之前,您可以尝试将“now”标准化为整秒。这在苹果公司也可能值得一个错误报告。 –