VIPER アーキテクチャのセットアップがあり、ワイヤフレームのインスタンス化を単体テストしようとしています。
VIPER が何であるかを知らない人にとって、理解すべき重要な部分は、重要な責任を持つ 4 つのクラスがあるということです。ワイヤーフレームは、残りの 3 つ (ビュー、プレゼンター、インタラクター) を作成します。ワイヤーフレームは、以下のようにそれらを適切に接続します。
Wireframe
^
|
v
View <-> Presenter <-> Interactor
そのため、Swift で単体テストを作成していますが、これらの接続がセットアップされていることを確認するのに苦労しています。コード自体は機能することに注意してください。単体テストでのアサートが問題です。
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")
}
これら 2 つのアサートはどちらも正しくコンパイルされません。
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)'
完全を期すため、および誰かがコードを役に立つと思うかもしれないため:
//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()
}