【问题标题】:Using an URL scheme in XCTestCase在 XCTestCase 中使用 URL 方案
【发布时间】:2014-12-01 04:31:27
【问题描述】:

我想运行一个等待浏览器响应的测试。

一个测试目标有一个 Info.plist,我可以在其中注册自定义 URL 方案。但那些永远不会被调用。我知道测试目标不是真正的应用程序。

有办法吗?

编辑(赏金):我想为调用 openUrl("tel://" + some phone number) 的类编写集成测试。如何在 XCTestCase 中订阅此 URL 方案?

【问题讨论】:

  • 你能用 NSURLProtocol 实现你所需要的吗?
  • 您能否重新表述一下“订阅 URL 方案”的意思?您的意思是,您如何确定分配哪个应用程序来处理特定方案?或者你的意思是,你如何测试 openURL 是否真的执行了这个动作?
  • 我的应用程序注册到这样的 URL 方案:myapp://。我想测试我是否可以在最终重定向到 myapp:// 的浏览器中打开 mywebsite.com

标签: objective-c xcode macos swift xctest


【解决方案1】:

问题已重新标记到 OS X,因此我的答案不再有效

原答案

这是不可能的。基本原因是测试连接到一个正在运行的应用程序实例,它们无法控制设备,它们作为应用程序的一部分运行。您可能可以打开 URL,但您将无法返回应用程序并执行断言。

另请注意,XCUnit 是一个单元测试框架。您将无法在其中编写高级集成测试。使用 UI 自动化可能会更成功,但即使是它,这个特定的测试用例也会非常复杂。例如,要通过您的应用在模拟器中打开链接,您可以创建一个 HTML 页面,该页面将重定向到该链接,然后使用 shell 执行 open testLink.html -a "iOS Simulator"。然而,在我看来,这种测试是不可靠的,而且很难编写和调试。

我的建议是:

  1. 编写一个模拟[UIApplication openURL:] 的单元测试,并验证您传递给它的URL 是否正确。或者,如果您想要另一个方向,请编写一个单元测试,它将按调用顺序调用 UIApplicationDelegate 方法,模拟您的应用程序打开一个链接。这是您使用 XCUnit 所能达到的程度。
  2. 手动测试其余部分。

【讨论】:

  • 我的问题是关于 OS X。我从来没有问过 iOS。但我想你是对的。无法将测试注册到 URL 方案。
  • @McZonk 你已经标记了cocoa-touch
  • 忠诚的丁利没有这样做。但是我认为这两个平台都会存在这个问题。
  • @McZonk 我不这么认为,与 OS X 相比,iOS 非常有限。我认为 OS X 上可能有办法。无论如何,我不认为 XCUnit 适合它。
【解决方案2】:

我不确定您到底要测试什么。我认为这不仅仅是 URL 是否可以打开。下面的测试用例检查 FaceTime 是否会打开并可以打开 URL。如果您正在测试的应用注册了自定义方案,那么只需更改 pathToTestApplication 即可。

class NSURL_SchemeTests: XCTestCase {

    func testWhoHandlesSchemeTel() {
        let testAppURL = NSURL(string: pathToTestApplication)

        // create a NSURL for the test
        let tel = "tel:5555555555"
        let url = NSURL(string: tel)
        XCTAssert(url != nil, "Could not create a URL from \(tel)")

        // determine whether any application is registered to handle the URL
        let workspace  = NSWorkspace.sharedWorkspace()
        let urlHandler = workspace.URLForApplicationToOpenURL(url!)
        XCTAssert(urlHandler != nil, "No application found to open URL \(tel)")

        // determine whether the expected test application is registered to handle the URL
        XCTAssert(urlHandler! == testAppURL,
            "Application \(pathToTestApplication) was not registered to handle URL \(tel)")

        // attempt to open the URL
        XCTAssert(workspace.openURL(url!), "Could not open URL \(tel)")
    }
}

【讨论】:

  • 我想测试我的应用程序是否成功注册到 URL 方案,以及打开 myapp:// 时是否收到回调。
  • 此 XCT 代码所属的测试目标确实会测试您的应用程序是否已注册以处理该方案。最后的测试还将确定它是否与应用程序成功通信。但是,如果您想查看您的应用程序实际从测试应用程序收到了什么,则必须对应用程序本身进行检测。
猜你喜欢
  • 2014-05-19
  • 1970-01-01
  • 2014-10-26
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
相关资源
最近更新 更多