如何单元测试iOS应用程序代理方法的调用?

时间:2017-01-15 22:56:41

标签: ios unit-testing appdelegate

我有一个与GitHub API集成的iOS应用程序。我正在对我的OAuth请求进行单元测试,这需要测试我将用于交换令牌的GitHub API中的代码的接收。

在我的AppDelegate.swift中,我有以下方法,用于在用户授权我的应用程序使用他们的GitHub帐户时处理来自GitHub的回调:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return true
}

步骤如下:

  1. 打开该应用程序。
  2. 使用网址授权GitHub帐户访问权限(https://github.com/login/oauth/authorize),会显示SFSafariViewController的实例,允许用户按下“授权”#39;按钮。
  3. GitHub使用我在使用GitHub注册我的应用程序时提供的应用程序的回调URL,GitHub发送通知以打开我的应用程序。
  4. 执行上述方法,我从code检索url参数。
  5. 然而,我一直试图找到一种方法来测试它,而不实际向GitHub API发出请求。我可以创建一个模仿GitHub提供我的应用程序的URL实例,但我想在没有提出实际请求的情况下测试它。

    有没有办法对此进行单元测试,或者这是我不应该担心的事情,因为它是由操作系统处理的,而只是测试我的代码来解析{{1}测试code的参数?

    更新

    在服用Jon的advice之后,我创建了一个测试类,允许我模拟GitHub的回调:

    URL

    然后,我创建了class GitHubAuthorizationCallbackTests: XCTestCase { let delegate = AppDelegateMock() func test_AuthorizationCallbackFromGitHub_ApplicationOpensURL() { guard let url = URL(string: "xxxxxxxxxxxxxx://?code=********************") else { return XCTFail("Could not construct URL") } let isURLOpened = delegate.application(UIApplication.shared, open: url) XCTAssertTrue(isURLOpened, "URL is not opened from GitHub authorization callback. Expected URL to be opened from GitHub authorization callback.") } } 来代替AppDelegateMock.swift,添加了在执行GitHub回调以打开我的应用程序时要调用的方法:

    AppDelegate.swift

    测试通过,允许我测试我需要测试的逻辑,以便处理从方法的import UIKit class AppDelegateMock: NSObject, UIApplicationDelegate { func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { return true } } 参数的GitHub返回的code参数。

1 个答案:

答案 0 :(得分:2)

因为你想测试一个回调...只是让测试直接调用回调,好像 GitHub框架调用了它。

围绕快乐路径编写简单的测试。然后,因为您正在处理您无法控制的外部数据,所以编写测试(如果Swift允许的话)使用奇怪的options调用回调。