Obecnie używam Quick + Nimble do testowania mojej jednostki w Swift. Buduję klasę Inviter
, która wysyła zaproszenia do aplikacji różnymi metodami.Jak wyśmiać UIApplication w Swift?
Muszę wyszydzić UIApplication, aby sprawdzić, czy mój kod wywołuje openURL
.
Mój kod do tej pory:
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."))
}
}
}
}
}
W tym podejściu, moje błędy aplikacji w czasie wykonywania stwierdzające, ze zrozumiałych względów nie może być tylko jeden UIApplication
. Wcześniej jeden mógł uczynić MockUIApplication
dziedziczyć po NSObject
i przekazać to w. Niestety, surowe sprawdzanie typów przez Swift wydaje się temu zapobiegać.
Chciałbym wszelkie pomysły.
Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? Mam teraz ten sam problem. – AnthonyM