2015-08-29 40 views
1

我有一個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)' 

爲了完整性和因爲有人可能認爲有用的代碼發生該錯誤

回答

1

我討厭,回答了自己的問題的傢伙,但是:

我不得不將每個協議都視爲一個類,th在結果引用操作符上使用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") 
} 

這確保模塊演示者指向與模塊交互者的演示者相同的對象。

+0

哦,它實際上可能在Xcode 7中修復了 –

+0

手指劃過 – ColdLogic

+0

這種方法似乎在Xcode 7中被破壞了 – ColdLogic

0

只要編譯器知道您正在嘗試比較LoginPresenter(conc從NSObject繼承平等的rete類)與LoginInteractorOutput - 似乎(源將幫助)的接口不擴展Equatable。所以它不知道如何比較這兩個。

可能的解決方案:

  • 力投LoginPresenter(不是很好)
  • 讓你LoginInteractorOutput繼承Equatable通過實施func ==(las: LoginInteractorOutput, hrs: LoginInteractorOutput) -> Bool
+0

不幸的是,我嘗試的第一件事之一是實現equatable,但它沒有奏效。 – ColdLogic