【问题标题】:Trying to call a class method from a protocol (Swift)尝试从协议中调用类方法(Swift)
【发布时间】:2020-11-25 13:30:05
【问题描述】:

我正在尝试为MFMailComposeViewController 编写一个假的进行测试,因此我创建了一个名为MailComposeViewController 的协议和一个符合该协议的FakeComposeViewController 类。我也让MFMailComposeViewController 也符合这个协议。

所以在我的代码中,当我调用它时,我说的是MailComposeViewController 类型,我想替换MFMailComposeViewController.canSendMail()。如果我尝试用我的协议替换:MailComposeViewController.canSendMail() 我得到错误Static member 'canSendMail' cannot be used on protocol metatype 'MailComposeViewController.Protocol' 这是有道理的。但是我将如何解决这个问题,以便我可以决定在测试时传递 FakeComposeViewController.canSendMail() true 响应并在运行时传递真正的 MFMailComposeViewController.canSendMail()?

【问题讨论】:

    标签: swift testing mocking mfmailcomposeviewcontroller


    【解决方案1】:

    您可以使用 TypeMailComposeViewController 本身

    func check(for viewControllerType: MailComposeViewController.Type) {
        if viewControllerType.canSendMail() { ... }
    }
    

    【讨论】:

      【解决方案2】:

      类似于 Robert 的建议,您也可以通过以下方式获取传递的控制器的类型:

      func test(controller: MailComposeViewController) {
          if type(of: controller).canSendMail() {
              // Do stuff
          } else {
              // Do something different
          }
      }
      

      【讨论】:

      • 这个解决方案的优点是直接传递控制器,如果你需要使用它执行进一步的工作,它就可以访问
      猜你喜欢
      • 1970-01-01
      • 2018-01-13
      • 2014-07-25
      • 2017-01-17
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      相关资源
      最近更新 更多