2015-05-14 29 views
11

Şu anda Swift'deki birim testlerim için Quick + Nimble kullanıyorum. Uygulama davetlerini farklı yöntemlerle gönderen bir Inviter sınıfı yapıyorum.Swift'de UIApplication ile nasıl alay edilir?

Kodumun openURL çağrılarını doğrulamak için UIApplication'ı dağıtmam gerekiyor. Bugüne kadar

Benim kod: Bu yaklaşımda

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

belirterek zamanında benim uygulama hataları anlaşılır tek UIApplication olabilir. Önceden, bir NSObject dan MockUIApplication kaliteyi yapabilir ve bunu iletebilir. Maalesef Swift'in sıkı tip denetimi de bunu engelliyor gibi görünüyor.

Fikirlere bayılırım.

+0

Buna bir çözüm buldunuz mu? Şu anda aynı problemim var. – AnthonyM

cevap

14

Siz yakınız. İhtiyacınız olan işlevler için bir protokol kullanın.

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

extension UIApplication: UIApplicationProtocol {} 

Sonra sadece Siz de UIApplicationProtocol kullanmak Inviter sınıfını değiştirmek gerekir sınıfın yerine

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

protokolünü kullanmak gerekir.

İlgili konular