Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中模拟NSLocale.preferredLanguages来测试请求?_Ios_Swift_Unit Testing_Mocking_Tdd - Fatal编程技术网

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

Ios 如何在Swift中模拟NSLocale.preferredLanguages来测试请求?,ios,swift,unit-testing,mocking,tdd,Ios,Swift,Unit Testing,Mocking,Tdd,我正在测试我的应用程序创建的请求,特别是“接受语言”及其值“en US;q=1.0”,通过请求?.allHTTPHeaderFields?[“接受语言”] 我在ObjC中没有这个问题,我使用OCMock来模拟NSLocale preferredLanguages(因为这取决于您使用的iOS或MAC计算机) 现在我正在使用Swift,我知道Swift是一种只读语言(不能实时更改) 那么,我怎样才能做到这一点呢 显然,我无法创建自己的NSLocale mock并将其注入NSURLRequest,因为

我正在测试我的应用程序创建的请求,特别是“接受语言”及其值“en US;q=1.0”,通过请求?.allHTTPHeaderFields?[“接受语言”]

我在ObjC中没有这个问题,我使用OCMock来模拟NSLocale preferredLanguages(因为这取决于您使用的iOS或MAC计算机)

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

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

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

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

编辑: 由于NSLocale是一个NSObject,或许我可以使用与此类似的方法:

最后,我使用swizzle将首选语言存根到Swift下,并在测试中写入

// 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)
}

“Swift是一种只读语言”——你是什么意思?这意味着反射非常有限。与objc相反,objc超级有用,不知道Swift可以像那样快速地使用方法。谢谢@这不是因为Swift,而是因为NSLocale是NSObject的一个子类。但事实并非总是如此。