gpt4 book ai didi

unit-testing - 如何在 Swift 中模拟 NSDate?

转载 作者:IT王子 更新时间:2023-10-29 05:41:33 26 4
gpt4 key购买 nike

我必须测试一些日期计算,但为此我需要在 Swift 中模拟 NSDate()。整个应用程序是用 Swift 编写的,我也想用它编写测试。

我已经尝试过 method swizzling 但它不起作用(或者我做错了更有可能)。

extension NSDate {
func dateStub() -> NSDate {
println("swizzzzzle")
return NSDate(timeIntervalSince1970: 1429886412) // 24/04/2015 14:40:12
}
}

测试:

func testCase() {
let original = class_getInstanceMethod(NSDate.self.dynamicType, "init")
let swizzled = class_getInstanceMethod(NSDate.self.dynamicType, "dateStub")
method_exchangeImplementations(original, swizzled)
let date = NSDate()
// ...
}

但是 date 始终是当前日期。

最佳答案

免责声明——我是 Swift 测试的新手,所以这可能是一个非常糟糕的解决方案,但我也一直在努力解决这个问题,所以希望这能帮助别人。

我找到了 this explanation成为一个巨大的帮助。

我必须在 NSDate 和我的代码之间创建一个缓冲类:

class DateHandler {
func currentDate() -> NSDate! {
return NSDate()
}
}

然后在任何使用 NSDate() 的代码中使用缓冲区类,提供默认的 DateHandler() 作为可选参数。

class UsesADate {
func fiveSecsFromNow(dateHandler: DateHandler = DateHandler()) -> NSDate! {
return dateHandler.currentDate().dateByAddingTimeInterval(5)
}
}

然后在测试中创建一个继承自原始 DateHandler() 的模拟,并将其“注入(inject)”到要测试的代码中:

class programModelTests: XCTestCase {

override func setUp() {
super.setUp()

class MockDateHandler:DateHandler {
var mockedDate:NSDate! = // whatever date you want to mock

override func currentDate() -> NSDate! {
return mockedDate
}
}
}

override func tearDown() {
super.tearDown()
}

func testAddFiveSeconds() {
let mockDateHandler = MockDateHandler()
let newUsesADate = UsesADate()
let resultToTest = usesADate.fiveSecondsFromNow(dateHandler: mockDateHandler)
XCTAssertEqual(resultToTest, etc...)
}
}

关于unit-testing - 如何在 Swift 中模拟 NSDate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29889246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com