如何在Swift中模拟UIApplication?

时间:2015-05-14 17:58:57

标签: swift unit-testing bdd

我目前正在使用Quick + Nimble在Swift中进行单元测试。我正在构建一个Inviter类,通过不同的方法发送应用邀请。

我需要模拟UIApplication以验证我的代码是否调用openURL

到目前为止我的代码:

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

在这种方法中,我在运行时的应用程序错误说明可以理解的只有一个UIApplication。以前,可以让MockUIApplication继承自NSObject,并将其传入。不幸的是,Swift的严格类型检查似乎也阻止了这一点。

会喜欢任何想法。

1 个答案:

答案 0 :(得分:18)

你很亲密。使用协议来获得所需的功能。

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

extension UIApplication: UIApplicationProtocol {}

然后你只需要使用协议而不是类

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

您还需要修改Inviter课程以使用UIApplicationProtocol