2014-10-06 3 views
8

Ich möchte einen Test ausführen, der auf die Antwort eines Browsers wartet.Verwenden eines URL-Schemas in XCTestCase

Ein Testziel hat eine Info.plist, wo ich benutzerdefinierte URL-Schemata registrieren kann. Aber diese werden nie genannt. Ich weiß, dass ein Testziel keine echte Anwendung ist.

Gibt es einen Weg?

EDIT (für Kopfgeld): Ich möchte einen Integrationstest für eine Klasse schreiben, die openUrl("tel://" + some phone number) aufruft. Wie abonniere ich dieses URL-Schema in einem XCTestCase?

+0

Können Sie erreichen, was Sie mit NSURLProtocol benötigen? –

+0

Könnten Sie das, was Sie unter "abonnieren zu einem URL-Schema" verstehen, anders formulieren? Meinst du, wie bestimmen Sie, welche Anwendung zugeordnet ist, um ein bestimmtes Schema zu behandeln? Oder meinst du, wie testen Sie, ob openURL tatsächlich die Aktion ausführt? –

+0

Meine Anwendung ist in einem URL-Schema wie folgt registriert: myapp: //. Ich möchte testen, ob ich http://mywebsite.com in einem Browser öffnen kann, der schließlich zu myapp: // weiterleitet. – McZonk

Antwort

-1

Ich bin unsicher, was genau Sie versuchen zu testen. Ich nehme an, dass es etwas mehr ist, als ob die URL geöffnet werden kann oder nicht. Der folgende Testfall prüft, ob FaceTime geöffnet wird und eine URL öffnen kann. Wenn die zu testende Anwendung ein benutzerdefiniertes Schema registriert, sollte die einfache Änderung pathToTestApplication funktionieren.

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

Ich möchte testen, ob meine Anwendung erfolgreich in einem URL-Schema registriert wurde und ob sie einen Rückruf erhält, wenn myapp: // geöffnet wird. – McZonk

+0

Das Testziel, dass dieser XCT-Code ein Teil von ist, wird in der Tat testen, ob Ihre Anwendung registriert ist, um das Schema zu behandeln.Der letzte Test bestimmt auch, ob er erfolgreich mit der Anwendung kommuniziert hat. Wenn Sie jedoch sehen möchten, was Ihre Anwendung tatsächlich von der Test-App erhalten hat, müssen Sie die Anwendung selbst instrumentieren. –

1

Die Frage an OS X retagged wurde so ist meine Antwort nicht mehr gültig

Ursprüngliche Antwort

Das ist unmöglich. Der Hauptgrund ist, dass die Tests mit einer laufenden Anwendungsinstanz verbunden sind, sie haben keine Kontrolle über das Gerät, sie werden als Teil der Anwendung ausgeführt. Sie können die URL wahrscheinlich öffnen, aber Sie können nicht zur Anwendung zurückkehren und eine Assertion ausführen.

Beachten Sie auch, dass XCUnit ist ein Einheit Test-Framework. Sie können keinen erweiterten Integrationstest darin schreiben. Sie könnten mit der UI-Automatisierung erfolgreicher sein, aber dieser spezielle Testfall wird sogar für ihn sehr kompliziert sein. Um beispielsweise einen Link von Ihrer App im Simulator zu öffnen, können Sie eine HTML-Seite erstellen, die auf den Link umgeleitet wird und dann die Shell zur Ausführung von exec open testLink.html -a "iOS Simulator" verwendet. Nach meiner bescheidenen Meinung ist diese Art von Tests jedoch unzuverlässig und wirklich schwer zu schreiben und zu debuggen.

Mein Rat wäre:

  1. ein Unit-Test schreiben, die [UIApplication openURL:] und überprüfen spottet, dass Sie eine korrekte URL es sind vorbei. Oder, wenn Sie die andere Richtung wollen, schreiben Sie einen Komponententest, der UIApplicationDelegate Methoden in der aufgerufenen Reihenfolge aufruft, simulierend das Öffnen eines Links durch Ihre APP. So weit können Sie mit XCUnit gehen.
  2. Den Rest manuell testen.
+0

Meine Frage bezieht sich auf ein OS X. Ich habe nie nach iOS gefragt. Aber ich denke du hast Recht. Es ist nicht möglich, einen Test für ein URL-Schema zu registrieren. – McZonk

+0

@McZonk Sie haben "Kakao-Touch" markiert. – Sulthan

+0

Nein Loyal Tingley tat. Ich denke jedoch, dass das Problem für beide Plattformen bestehen wird. – McZonk

Verwandte Themen