2016-06-11 65 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作为参数/属性,你甚至可以插入你的日期格式化器(因为这是你需要子类的唯一原因,不需要子类化。 ) 更好的方法是为每个日期源设置一个特定的日期格式化程序,并在日期来自该源时使用该日期格式程序。这避免了试图使一个日期格式化程序“将所有格式化”的整个问题。 –

相关问题