2015-05-14 19 views
11

Tôi hiện đang sử dụng Quick + Nimble để kiểm tra đơn vị của mình trong Swift. Tôi đang xây dựng một lớp học Inviter gửi lời mời tham gia ứng dụng qua các phương pháp khác nhau.Làm thế nào để giả lập UIApplication trong Swift?

Tôi cần giả lập UIApplication để xác minh rằng mã của tôi gọi openURL.

Mã của tôi cho đến nay:

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

Trong phương pháp này, các lỗi ứng dụng của tôi trong thời gian chạy nêu có thể hiểu được có thể chỉ có một UIApplication. Trước đây, người ta có thể tạo ra MockUIApplication kế thừa từ NSObject và chuyển nó vào. Thật không may, việc kiểm tra kiểu nghiêm ngặt của Swift dường như cũng ngăn chặn điều đó.

Rất thích bất kỳ ý tưởng nào.

+0

Bạn đã bao giờ tìm được giải pháp cho điều này chưa? Tôi đã có cùng một vấn đề ngay bây giờ. – AnthonyM

Trả lời

14

Bạn đang đóng cửa. Sử dụng giao thức cho các chức năng bạn cần.

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

extension UIApplication: UIApplicationProtocol {} 

Sau đó, bạn chỉ cần sử dụng giao thức thay vì lớp

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

Bạn sẽ cần phải sửa đổi các lớp Inviter sử dụng UIApplicationProtocol là tốt.

Các vấn đề liên quan