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.
| 归档时间: |
|
| 查看次数: |
2414 次 |
| 最近记录: |