3

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()
 }
4

2 に答える 2

2

私は自分の質問に答える男になるのは嫌いですが、

すべてのプロトコルをクラスと見なすようにし、結果参照演算子で nil 合体を使用してこれを機能させる必要がありました。

protocol LoginInteractorInput : class {

}

func testInitWithNothingShouldInstantiateVIPERStackAndConnectLayers() {
    wireframe = LoginWireframe()       

    XCTAssert(wireframe.modulePresenter === wireframe.moduleInteractor.presenter ? true : false, "Interactor's presenter must be the module's presenter")
}

これにより、モジュール プレゼンターがモジュール インタラクターのプレゼンターと同じオブジェクトを指すようになります。

于 2015-09-07T21:47:10.157 に答える