swift - 在swift中将可测试代码与静态方法调度结合起来

标签 swift function dispatch testability

我最近阅读了很多有关 Swift 运行时的文章,并且对使用静态方法分派(dispatch)优化我的代码越来越感兴趣。这发生在以下方法中:

  • 结构方法
  • final 类方法,即用 final 关键字声明为私有(private)或在 final 类中
  • 在协议(protocol)扩展中定义的协议(protocol)方法,但未在协议(protocol)本身中声明。

问题是,这些情况都不能让我编写可测试的代码,至少不是我现在这样做的方式:注入(inject)在单元测试中被模拟替换的协议(protocol)实体。

那么,是否有可能在不放弃静态方法分派(dispatch)的情况下编写可测试的代码,如果可以的话,应该怎么做呢?

谢谢!

最佳答案

泛型正是您要寻找的。您可以对协议(protocol)进行抽象,但编译器仍然知道您使用的确切类型,因此不需要动态调度。

protocol Dependency {
  func doSomething()
}

struct RealDependency: Dependency {
  func doSomething() {
    print("I'm doing real work")
  }
}

struct MockDependency: Dependency {
  func doSomething() {
    print("I'm the mock, so I do nothing")
  }
}

struct MyApp<D: Dependency> {
  let dependency: D

  func doSomething() {
    dependency.doSomething()
  }
}

let myAppReal = MyApp(dependency: RealDependency())
let myAppMock = MyApp(dependency: MockDependency())

myAppReal.doSomething() // Prints "I'm doing real work"
myAppMock.doSomething() // Prints "I'm the mock, so I do nothing"

但是请注意,在 Swift 中,不能保证泛型单态化。因此,您可能无论如何都会以某种形式的动态调度结束。参见 this link

关于swift - 在swift中将可测试代码与静态方法调度结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53180010/

相关文章:

swift - UITextfield 类快速调用委托(delegate)方法

c++ - 检查模板参数

c++ - 我不明白这个 c++ 错误,但我需要帮助来修复它

javascript - 使用 ":checked"切换显示和隐藏 &lt;iframe&gt;

events - 操作系统或系统程序如何等待用户输入?

ios - SpriteKit 动画 - 保持 Sprite 固定

swift - Swift 3.1 中没有空或通配符的详尽 catch block

swift - 如何继承SKspriteNode并通过self.childNode创建

angular - 在 ngrx effect angular 中做某事之前等待两个序列 Action

c++ - 如何创建基于类型的查找表以在 C++ 中实现多重调度?