如何在Swift中模拟NSLocale.preferredLanguages来测试请求?

时间:2016-08-12 13:57:35

标签: ios swift unit-testing mocking tdd

我正在测试我的应用创建的请求,特别是" Accept-Language"及其价值" en-US; q = 1.0"通过请求?.allHTTPHeaderFields?[" Accept-Language"]

我在ObjC中没有遇到问题,我使用OCMock来模拟NSLocale preferredLanguages(因为它会根据您使用的iOS或MAC计算机而改变)。

现在我正在使用Swift,我知道Swift是一种只读语言(无法实时更改)。

那么,我怎样才能做到这一点?

显然,我无法创建自己的NSLocale模拟并将其注入NSURLRequest,因为这是一个私有类。 也许使用混合(不知道),或者使用扩展的技巧,不知道。

您有任何想法或建议吗?非常感谢。

编辑: 由于NSLocale是一个NSObject,也许我可以使用类似的方法: https://github.com/kylef/Mockingjay/blob/master/Mockingjay/NSURLSessionConfiguration.swift

1 个答案:

答案 0 :(得分:1)

最后,我设法使用swizzle在Swift下存根preferredRanguages,在测试中写这个。

// stub preferredLanguages before all the tests start
override class func setUp() {
    WAClientTests.exchangePreferredLanguagesImplementation()
}

// stop stubbing preferredLanguages after passing all tests
override class func tearDown() {
    WAClientTests.exchangePreferredLanguagesImplementation()
}

static func stubPreferredLanguages() -> [String] {
    return ["en-US"]
}

class func exchangePreferredLanguagesImplementation() {
    let originalMethod = class_getClassMethod(NSLocale.classForCoder(), #selector(NSLocale.preferredLanguages))
    let swizzledMethod = class_getClassMethod(WAClientTests.classForCoder(), #selector(WAClientTests.stubPreferredLanguages))
    method_exchangeImplementations(originalMethod, swizzledMethod)
}