我有一個單元測試,看起來像這樣:爲什麼我的簡單日期計算有時在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」標準化爲整秒。這在蘋果公司也可能值得一個錯誤報告。 –