如何在Swift中模拟UIApplication?

Chr*_*ell 13 bdd unit-testing swift

我目前正在使用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."))
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

会喜欢任何想法.

res*_*ode 18

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

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

extension UIApplication: UIApplicationProtocol {}
Run Code Online (Sandbox Code Playgroud)

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

extension Inviter {
    convenience init(usingMockApplication mockApplication: UIApplicationProtocol) {
        self.init()
        application = mockApplication
    }
}
Run Code Online (Sandbox Code Playgroud)

您还需要修改Inviter要使用的类UIApplicationProtocol.