2015-05-14 11 views
11

Obecnie używam Quick + Nimble do testowania mojej jednostki w Swift. Buduję klasę Inviter, która wysyła zaproszenia do aplikacji różnymi metodami.Jak wyśmiać UIApplication w Swift?

Muszę wyszydzić UIApplication, aby sprawdzić, czy mój kod wywołuje openURL.

Mój kod do tej pory:

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.")) 
       } 
      } 
     } 
    } 
} 

W tym podejściu, moje błędy aplikacji w czasie wykonywania stwierdzające, ze zrozumiałych względów nie może być tylko jeden UIApplication. Wcześniej jeden mógł uczynić MockUIApplication dziedziczyć po NSObject i przekazać to w. Niestety, surowe sprawdzanie typów przez Swift wydaje się temu zapobiegać.

Chciałbym wszelkie pomysły.

+0

Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? Mam teraz ten sam problem. – AnthonyM

Odpowiedz

14

Jesteś blisko. Użyj protokołu dla potrzebnych funkcji.

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

extension UIApplication: UIApplicationProtocol {} 

Wtedy po prostu trzeba użyć protokołu zamiast klasy

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

Trzeba będzie zmodyfikować klasę Inviter do korzystania UIApplicationProtocol również.

Powiązane problemy