我有一個VIPER體系結構設置,並試圖單元測試線框的實例。單元測試符合Swift協議的對象和變量
對於任何不知道VIPER是什麼的人來說,理解的關鍵部分是有4個類別具有關鍵職責。線框創建另外3個(視圖,演示者和交互者)。線框然後將它們連接適當象下面這樣:
Wireframe
^
|
v
View <-> Presenter <-> Interactor
所以我創造了斯威夫特的單元測試,以及時遇到困難,確保這些連接設置。請注意,代碼本身起作用,單元測試中的斷言是問題所在。
func testInitWithNothingShouldInstantiateVIPERStackAndConnectLayers() {
wireframe = LoginWireframe()
XCTAssertEqual(wireframe.modulePresenter, wireframe.moduleInteractor.presenter, "Interactor's presenter must be the module's presenter")
XCTAssert(wireframe.modulePresenter === wireframe.moduleInteractor.presenter, "Interactor's presenter must be the module's presenter")
}
這兩個斷言都不能正確編譯。
//LoginWireframe.swift
class LoginWireframe: NSObject, LoginWireframeInterface {
lazy var moduleInteractor = LoginInteractor()
lazy var modulePresenter = LoginPresenter()
lazy var moduleView = LoginView()
lazy var presenter : LoginRouting = self.modulePresenter
override init() {
super.init()
let i = moduleInteractor
let p = modulePresenter
let v = moduleView
i.presenter = p
p.interactor = i
p.view = v
p.wireframe = self
v.presenter = p
presenter = p
}
//LoginInteractor.swift
class LoginInteractor: NSObject, LoginInteractorInput {
lazy var presenter : LoginInteractorOutput = LoginPresenter()
}
//LoginPresenter.swift
class LoginPresenter : NSObject, LoginInteractorOutput, LoginPresenterInterface, LoginRouting {
lazy var interactor : LoginInteractorInput = LoginInteractor()
lazy var view : LoginViewInterface = LoginView()
lazy var wireframe : LoginWireframeInterface = LoginWireframe()
}
//LoginView.swift
class LoginView : UIViewController, LoginViewInterface {
lazy var presenter : LoginPresenterInterface = LoginPresenter()
}
:
對於XCTAssertEqual
Cannot find an overload for 'XCTAssertEqual' that accepts an argument list of type '(LoginPresenter, LoginInteractorOutput, String)'
對於XCTAssert(或XCTAssertTrue),此錯誤時
Cannot invoke 'XCTAssert' with an argument list of type '(Bool, String)'
爲了完整性和因爲有人可能認爲有用的代碼發生該錯誤
哦,它實際上可能在Xcode 7中修復了 –
手指劃過 – ColdLogic
這種方法似乎在Xcode 7中被破壞了 – ColdLogic