我目前正在使用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的严格类型检查似乎也阻止了这一点。
会喜欢任何想法。
答案 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
。