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

标签 ios swift unit-testing mocking tdd

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

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

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

那么,我该如何实现呢?

显然,我不能创建自己的 NSLocale 模拟并将其注入(inject) NSURLRequest,因为那是一个私有(private)类。 也许使用调配(不知道),或者可能是使用扩展的技巧,不知道。

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

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

最佳答案

最后,我设法使用 swizzle 在 Swift 下对 preferredLanguages 进行 stub ,并将其写入测试中。

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

关于ios - 如何在 Swift 中模拟 NSLocale.preferredLanguages 来测试请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38919827/

相关文章:

unit-testing - 如何对 Angular2 中调用 window.location.href 的函数进行单元测试

ios - 使用NSFetchedResultsController来获取对象的属性

Swift 将三位数 Base64 数字转换为 Int

ios - Crashlytics 在 Release模式下不报告崩溃

ios - 如何获取 Assets 目录组中的所有图像名称?

ios - 弹出窗口关闭后删除模糊背景

java - 考试补习类在哪里保存?

unit-testing - 模拟大返回结果

ios - 静态计算变量被多次实例化

objective-c - 自定义 friendsPickerViewController 的样式