我有一个与GitHub API集成的iOS应用程序。我正在对我的OAuth
请求进行单元测试,这需要测试我将用于交换令牌的GitHub API中的代码的接收。
在我的AppDelegate.swift
中,我有以下方法,用于在用户授权我的应用程序使用他们的GitHub帐户时处理来自GitHub的回调:
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return true
}
步骤如下:
SFSafariViewController
的实例,允许用户按下“授权”#39;按钮。code
检索url
参数。然而,我一直试图找到一种方法来测试它,而不实际向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
参数。
答案 0 :(得分:2)
因为你想测试一个回调...只是让测试直接调用回调,好像 GitHub框架调用了它。
围绕快乐路径编写简单的测试。然后,因为您正在处理您无法控制的外部数据,所以编写测试(如果Swift允许的话)使用奇怪的options
调用回调。