iOS AppDelegate 单元测试

iOS Unit Test on AppDelegate

我是 iOS 开发的新手。我想创建一个功能,当应用程序首次启动时,它可以根据系统语言切换应用程序语言。如何创建单元测试来测试该功能?

这是我在 AppDelegate.swift 中的代码,我想测试 "setLang" 函数: 测试用例应该是:

setLang("en", 设置)

预期结果:setting.string(forKey:"lang") == "en"

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    applySetting()
    return true
}

func applySetting(){
    setLang(SysLangCode: Locale.current.languageCode, UserSetting: UserDefaults.standard)
}

func setLang(SysLangCode sysLang:String?, UserSetting setting:UserDefaults){
   //Some logic to check sysLang
   setting.set(sysLang, forKey:"lang")
}
...

这是我的单元测试,但失败了 "Fatal error: Unexpectedly found nil while unwrapping an Optional value"

class xxx: XCTestCase {
   var appDelegate: AppDelegate!
   func testSetLang(){
    self.appDelegate.setLang(SysLangCode: "en", UserSetting:UserDefaults.standard)
    XCTAssert(UserDefaults.standard.string(forKey: "lang") == "en")
   }
}

如果您已将单元测试目标添加到您的项目,那么简单的单元测试将如下所示:

func testLanguageCodeCanBeSetInUserDefaults() {
    UserDefaults.standard.set(Locale.current.languageCode,
                              forKey: "lang")

    XCTAssertEqual(UserDefaults.standard.string(forKey: "lang"),
                   Locale.current.languageCode)
}

要将单元测试目标添加到您的项目:

File > New > Target > iOS > iOS Unit Testing Bundle


编辑:(基于您的)

func testAppDelegateCanSetLanguageCodeToUserDefaults() {
    let appDelegate = AppDelegate()        
    appDelegate.setLang(SysLangCode: "en", 
                        UserSetting:UserDefaults.standard)

    XCTAssertEqual(UserDefaults.standard.string(forKey: "lang"),
                   "en")
}