2016-08-12 43 views
1

我正在通过请求?.allHTTPHeaderFields?[“Accept-Language”]测试我的应用创建的请求,特别是“Accept-Language”及其值“en-US; q = 1.0”如何在Swift中模拟NSLocale.preferredLanguages来测试请求?

我不在ObjC中有问题,我使用OCMock模拟NSLocale首选语言(因为这取决于您使用的iOS或MAC计算机)。

现在我正在使用Swift,并且我知道Swift是只读语言(不能实时更改)。

那么,我该如何做到这一点?

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

你有什么想法或建议吗?非常感谢。

编辑: 作为NSLocale是一个NSObject,也许我可以用类似的方法来这样一句: https://github.com/kylef/Mockingjay/blob/master/Mockingjay/NSURLSessionConfiguration.swift

+0

*“Swift是一种只读语言”* - 你是什么意思? –

+0

这意味着反射非常有限。与objc相反https://realm.io/news/tryswift-veronica-ray-real-world-mocking-swift/ – Ricardo

回答

0

最后我设法用调酒存根斯威夫特下preferredLanguages,写这个测试里面。

// 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) 
} 
相关问题