2016-06-11 63 views
0

我有一個日期數組,我想從NSDateFormatter獲取NSDate對象。什麼是單元測試NSDateFormatter的好方法?

let dates = [ 
    "Tue, 04 Feb 2014 22:03:45 Z", 
    "Sun, 05 Jun 2016 08:35:14 Z", 
    "Sun, 05 Jun 2016 08:54 +0000", 
    "Mon, 21 Mar 2016 13:31:23 GMT", 
    "Sat, 04 Jun 2016 16:26:37 EDT", 
    "Sat, 04 Jun 2016 11:55:28 PDT", 
    "Sun, 5 Jun 2016 01:51:07 -0700", 
    "Sun, 5 Jun 2016 01:30:30 -0700", 
    "Thu, 02 June 2016 14:43:37 GMT", 
    "Sun, 5 Jun 2016 01:49:56 -0700", 
    "Fri, 27 May 2016 14:32:19 -0400", 
    "Sun, 05 Jun 2016 01:45:00 -0700", 
    "Sun, 05 Jun 2016 08:32:03 +0000", 
    "Sat, 04 Jun 2016 22:33:02 +0000", 
    "Sun, 05 Jun 2016 01:52:30 -0700", 
    "Thu, 02 Jun 2016 15:24:37 +0000" 
] 

我與GWT模式走,但感覺怪怪的結構我的單元測試一樣,因爲我需要編寫各種情況下的十多種不同的測試funtions。

任何人都可以提出一個更好的方法嗎?或者這是「Given,When,Then」模式的可接受用法?

..我真的不希望有一個testRFC822DateFormatter1(),testRFC822DateFormatter2(),testRFC822DateFormatter3(),...

func testRFC822DateFormatter() { 

    // Given 
    let rfc822DateFormatter = RFC822DateFormatter() 
    let dateString = "Tue, 04 Feb 2014 22:03:45 Z" 

    // When 
    let date = rfc822DateFormatter.dateFromString(dateString) 

    // Then 
    XCTAssertNotNil(date) 

    let components = NSCalendar.currentCalendar().components([.Year, .Month, .Day, .Hour, .Minute, .Second, .TimeZone, .Calendar], fromDate: date!) 

    XCTAssertEqual(components.day, 4) 
    XCTAssertEqual(components.month, 2) 
    XCTAssertEqual(components.year, 2014) 
    XCTAssertEqual(components.hour, 22) 
    XCTAssertEqual(components.minute, 3) 
    XCTAssertEqual(components.second, 45) 
    XCTAssertEqual(components.timeZone?.daylightSavingTimeOffset, 3600) 
    XCTAssertEqual(components.timeZone?.secondsFromGMT, 3600) 
    XCTAssertEqual(components.calendar?.calendarIdentifier, NSCalendarIdentifierGregorian) 

} 

謝謝!

+0

我很好奇你爲什麼寫自己的日期格式化程序而不是使用'NSDateFormatter'? –

+0

我是,它實際上是NSDateFormatter的一個子類。我不知道這種格式可能是什麼,只是它符合3個可能的RFC規範中的1個,不幸的是,它需要與上面的RFC(RFC822)一起放鬆。 – nmdias

+0

我假設字符串數組只是一個有代表性的樣本? (否則,你可以創建一個NSDate數組並且完成它。) –

回答

1

有兩種你需要的測試。

1)一個測試,以確保特定的dateFormat與日期的特定格式正常工作。 2)一個測試,以確保如果兩個不同的dateFormats工作在一個特定的日期格式,他們要麼是相同的,要麼你的邏輯會選擇正確的。

因此,我會設想一個測試每個dateFormat和一個測試每個日期可能會匹配多個格式。

對於這些測試,據我所知,GWT模式沒有問題。更重要的是識別您需要使用的所有各種日期格式,並確保每個日期都使用正確的日期格式。


順便說一句,我會不舒服子類NSDateFormatter,我也不看,它是必要的...對於輸入你在你的問題中指定,下面的代碼是所有必要:

let dateFormatter1: NSDateFormatter = { 
    let result = NSDateFormatter() 
    result.dateFormat = "EEE, d MMM yyyy HH:mm:ss Z" 
    return result 
}() 

let dateFormatter2: NSDateFormatter = { 
    let result = NSDateFormatter() 
    result.dateFormat = "EEE, d MMM yyyy HH:mm Z" 
    return result 
}() 

let dateFormatter3: NSDateFormatter = { 
    let result = NSDateFormatter() 
    result.dateFormat = "EEE, d MMM yyyy HH:mm:ss z" 
    return result 
}() 

func dateFromString(dateString: String) -> NSDate? { 
    return dateFormatter1.dateFromString(dateString) ?? dateFormatter2.dateFromString(dateString) ?? dateFormatter3.dateFromString(dateString) 
} 

而對於上面的代碼,我預計總共有三個測試,每個日期格式化程序一個。

+0

我會按照你的建議在測試部分。就像旁邊一樣,當你說你「不習慣NSDateFormatter的子類化」時,我覺得你給我一個曲線球。我的意思是,這是oop。關於你爲什麼不這樣做的具體原因?我正在處理3種不同的規格,大約有十幾種或更多種可能的格式。無論如何,謝謝你,先生。我很感激幫助。 – nmdias

+0

有幾個不同的原因...(1)NSDateFormatter不是被設計爲被分類的。 (2)我希望你的代碼中沒有任何地方接受一個NSDateFormatter作爲參數/屬性,你甚至可以插入你的日期格式化器(因爲這是你需要子類的唯一原因,不需要子類化。 ) 更好的方法是爲每個日期源設置一個特定的日期格式化程序,並在日期來自該源時使用該日期格式程序。這避免了試圖使一個日期格式化程序「將所有格式化」的整個問題。 –

相關問題