2016-08-12 42 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) 
} 
相關問題