NSDate 和測試的那些小事
純粹筆記一下遇到的問題~
最近在處理日期資料,寫了測試要驗證日期是否正確,於是就碰到兩的問題:
- 要怎麼驗證
NSDate
object? - 知道怎麼驗證了,怎麼時間就差這麼一些,測試沒過?
怎麼驗證 NSDate
之前有寫過一篇有關於 XCTAssert 的文章 - XCTest Assertions 及其種類 有列出有哪些 XCTAssert 可以用,於是就要從這邊挑一個出來用。
上網找了找資料,其實只要取得 NSDate 物件的 timestamp 即可,再去對照處理的日期的 timestamp 是否符合預期即可。
timestamp 的型態是 doulble ,因此要比較他的精準度,就要使用 XCTAssertEqualWithAccuracy
了
XCTAssertEqualWithAccuracy
先複習一下,
1 | XCTAssertEqualWithAccuracy(expression1, expression2, accuracy, format...) |
expression1
和expression2
是兩個需要比較的對象accuracy
則是放比較的精準度format...
則是可以放測試沒過需要在 console 印出的文字
那就來比吧
1 | XCTAssertEqualWithAccuracy(targetTimestamp, [checkedDate timeIntervalSince1970], 0.01); |
targetTimestamp
是個 double 變數,存放預期值checkedDate
則是需要被檢查的目標 NSDate 物件0.01
則是容許的誤差值
當時這樣跑下去,綠燈還亮不了 … 繼續看下去 …
時區問題
在寫 date formatter 的時候,我的需求是要由字串轉成 NSDate object ,
於是很爽快地就做完了,
測下去發現產出的 timestamp 轉換之後硬生生的多了八個小時。
後來又翻了翻文件,發現 NSDateFormatter
會自動幫你轉成手機的當地時間,我所在的時區是台北, GMT 的時間 +8 ,因此在這時候就需要把 date formatter 的時區設定好,或是在測試的時候需要加上時區的調整。
NSDateFormatter - Time Zone
如果時間要以 GMT 為準,就可以設定一下 date formatter 的時區,
1 | dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; |
dateFormatter
是 NSDateFormatter 的 instance
這時候,
由這個物件產出來的日期,就和 GMT 一致了