2014-10-06 26 views
8

我想运行等待浏览器响应的测试。在XCTestCase中使用URL方案

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

有没有办法?

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

+0

你能用NSURLProtocol实现你所需要的吗? – 2015-04-23 03:12:33

+0

您可以通过'订阅URL方案'来重新表达您的意思吗?你的意思是,你如何确定分配哪个应用程序来处理特定的方案?或者你的意思是,你如何测试openURL是否实际执行操作? – 2015-04-23 18:27:47

+0

我的应用程序被注册到这样的URL方案:myapp://。我想测试是否可以在浏览器中打开http://mywebsite.com,最终将重定向到myapp://。 – McZonk 2015-04-24 07:51:06

回答

-1

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

enter image description here

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)") 
    } 
} 
+0

我想测试我的应用程序是否已成功注册到URL方案,并且在myapp://打开时是否获得回调。 – McZonk 2015-04-28 14:24:40

+0

这个XCT代码的一部分测试目标将确实测试您的应用程序是否已注册以处理该方案。最后的测试也将决定它是否成功与应用程序通信。但是,如果您想查看应用程序实际从测试应用程序接收到的内容,则必须自行对应用程序进行测试。 – 2015-04-28 14:27:37

1

问题被重新标记到OS X,所以我的答案是不再有效

原来的答复

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

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

我的建议是:

  1. 写一个单元测试嘲笑[UIApplication openURL:]并验证您传递正确的URL给它。或者,如果您想要另一个方向,请编写一个单元测试,以被调用的顺序调用UIApplicationDelegate方法,模拟您的应用程序打开链接。这是迄今为止您可以使用XCUnit。
  2. 手动测试其余部分。
+0

我的问题是关于一个OS X.我从来没有问过iOS。但我想你是对的。向URL方案注册测试是不可能的。 – McZonk 2015-04-28 14:37:16

+0

@McZonk你已经标记了'cocoa-touch'。 – Sulthan 2015-04-28 14:41:22

+0

没有忠诚的Tingley做过。不过,我认为这个问题对于两个平台都是存在的。 – McZonk 2015-04-28 14:42:28