Tôi hiện đang sử dụng Quick + Nimble để kiểm tra đơn vị của mình trong Swift. Tôi đang xây dựng một lớp học Inviter
gửi lời mời tham gia ứng dụng qua các phương pháp khác nhau.Làm thế nào để giả lập UIApplication trong Swift?
Tôi cần giả lập UIApplication để xác minh rằng mã của tôi gọi openURL
.
Mã của tôi cho đến nay:
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."))
}
}
}
}
}
Trong phương pháp này, các lỗi ứng dụng của tôi trong thời gian chạy nêu có thể hiểu được có thể chỉ có một UIApplication
. Trước đây, người ta có thể tạo ra MockUIApplication
kế thừa từ NSObject
và chuyển nó vào. Thật không may, việc kiểm tra kiểu nghiêm ngặt của Swift dường như cũng ngăn chặn điều đó.
Rất thích bất kỳ ý tưởng nào.
Bạn đã bao giờ tìm được giải pháp cho điều này chưa? Tôi đã có cùng một vấn đề ngay bây giờ. – AnthonyM