unit testing - How to mock UIApplication in Swift? -
i'm using quick + nimble unit testing in swift. i'm building inviter class sends app invites via different methods.
i need mock out uiapplication verify code calls openurl.
my code far:
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 application open whatsapp") { expect(mockapplication.openedurl).tonot(benil()) } it("should send whatsapp right message") { let message = mockapplication.openedurl?.lastpathcomponent expect(message).to(equal("invite%message.")) } } } } } in approach, app errors @ runtime stating there can understandably 1 uiapplication. previously, 1 make mockuiapplication inherit nsobject, , pass in. unfortunately swift's strict type checking seems prevent too.
would love ideas.
you close. use protocol functions need.
protocol uiapplicationprotocol { func openurl(url: nsurl) -> bool } extension uiapplication: uiapplicationprotocol {} then need use protocol instead of class
extension inviter { convenience init(usingmockapplication mockapplication: uiapplicationprotocol) { self.init() application = mockapplication } } you need modify inviter class use uiapplicationprotocol well.
Comments
Post a Comment