Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 单元测试符合Swift协议的对象和变量_Ios_Swift_Unit Testing_Xctest_Viper Architecture - Fatal编程技术网

Ios 单元测试符合Swift协议的对象和变量

Ios 单元测试符合Swift协议的对象和变量,ios,swift,unit-testing,xctest,viper-architecture,Ios,Swift,Unit Testing,Xctest,Viper Architecture,我有一个VIPER架构设置,正在尝试对线框的实例化进行单元测试 对于任何不知道VIPER是什么的人来说,需要了解的关键部分是有4个类具有关键职责。线框创建其他3个(视图、演示者和交互者)。然后,线框将它们适当地连接起来,如下所示: Wireframe ^ |

我有一个VIPER架构设置,正在尝试对线框的实例化进行单元测试

对于任何不知道VIPER是什么的人来说,需要了解的关键部分是有4个类具有关键职责。线框创建其他3个(视图、演示者和交互者)。然后,线框将它们适当地连接起来,如下所示:

                              Wireframe
                                  ^
                                  |
                                  v
                     View <-> Presenter <-> Interactor
这两个断言都不能正确编译

对于XCTASERTEQUAL,会发生此错误

Cannot find an overload for 'XCTAssertEqual' that accepts an argument list of type '(LoginPresenter, LoginInteractorOutput, String)'
Cannot invoke 'XCTAssert' with an argument list of type '(Bool, String)'
对于XCTAssert(或XCTAssertTrue),会发生此错误

Cannot find an overload for 'XCTAssertEqual' that accepts an argument list of type '(LoginPresenter, LoginInteractorOutput, String)'
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()
 }

据编译器所知,您正试图将
LoginPresenter
(从
NSObject
继承相等性的具体类)与
LoginInteractorOutput
——一个似乎(源代码可能会有所帮助)没有扩展
相等性的接口进行比较。所以它不知道如何比较这两者

可能的解决办法:

  • 强制转换
    LoginPresenter
    (不好)
  • 通过实现
    func==(las:LoginInteractorOutput,hrs:LoginInteractorOutput)->Bool,使您
    LoginInteractorOutput
    继承
    equalable

    • 我讨厌自己回答问题,但是:

      我必须将每个协议都视为一个类,然后对结果引用操作符使用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")
      }
      

      这可以确保模块演示者指向与模块交互者的演示者相同的对象。

      不幸的是,我尝试的第一件事就是实现equatable,但它不起作用。