2015-05-14 9 views
11

Attualmente sto usando Quick + Nimble per il mio test dell'unità in Swift. Sto creando una classe Inviter che invia gli inviti alle app con metodi diversi.Come simulare un'applicazione UIA in Swift?

Devo prendere in giro l'applicazione UIA per verificare che il mio codice chiami openURL.

Il mio codice finora:

import Quick 
import Nimble 
import OCMock 

extension Inviter { 
    convenience init(usingMockApplication mockApplication: UIApplication) { 
     self.init() 
     application = mockApplication 
    } 
} 

class MockUIApplication : UIApplication { 
    var application = UIApplication.sharedApplication() 

    var openedURL: String? 

    override func openURL(url: NSURL) -> Bool { 
     openedURL = url.absoluteString 
     return true 
    } 
} 

class InviterSpec: QuickSpec { 
    override func spec() { 

     describe("Inviter") { 
      var mockApplication = MockUIApplication() 
      var inviter = Inviter(usingMockApplication: mockApplication) 

      beforeEach() { 
       inviter = Inviter(usingMockApplication: mockApplication) 
      } 

      context("for WhatsApp invites") { 
       beforeEach() { 
        inviter.inviteViaWhatsAppWithMessage("Invite Message.") 
       } 

       it("should tell the application to open WhatsApp") { 
        expect(mockApplication.openedURL).toNot(beNil()) 
       } 

       it("should send WhatsApp the right message") { 
        let message = mockApplication.openedURL?.lastPathComponent 
        expect(message).to(equal("Invite%Message.")) 
       } 
      } 
     } 
    } 
} 

In questo approccio, i miei errori app in fase di esecuzione affermando non ci può essere un solo comprensibilmente UIApplication. In precedenza, uno poteva rendere MockUIApplication ereditato da NSObject e inoltrarlo. Purtroppo il severo controllo di tipo di Swift sembra impedire anche questo.

Mi piacerebbe qualche idea.

+0

Hai mai trovato una soluzione a questo? Ho lo stesso problema adesso. – AnthonyM

risposta

14

Sei vicino. Utilizzare un protocollo per le funzioni necessarie.

protocol UIApplicationProtocol { 
    func openURL(url: NSURL) -> Bool 
} 

extension UIApplication: UIApplicationProtocol {} 

Poi basta utilizzare il protocollo al posto della classe

extension Inviter { 
    convenience init(usingMockApplication mockApplication: UIApplicationProtocol) { 
     self.init() 
     application = mockApplication 
    } 
} 

Sarà necessario modificare la classe Inviter da utilizzare UIApplicationProtocol pure.