如何使用间谍对 textView 进行单元测试

How to unit test a textView using a spy

我有一个包含 textView 的单元格,我想使用单元测试测试 textView 的属性是否设置正确。但是,自从它是私有的以来,在测试中访问 textView 时,我似乎遇到了障碍。

有什么方法可以测试我的 textView:-

这是我的代码

class MyCell {

  private let myText: UITextView = {
      let textView = UITextView()
      textView.isScrollEnabled = false
      textView.isEditable = false

      return textView
    }()

  func setup(viewModel: MYViewModel) {

      if viewModel.someValue {
          myText.backgroundColor = UIColor.red
      } else {
          myText.backgroundColor = .clear
      }

    }
}

是否可以测试类似 testView 的背景颜色设置为透明的东西?

只需从您的声明中删除 private。然后访问控制将是默认的internal。在测试代​​码中,确保 @testable import 以便访问内部功能。

对一些属性进行单元测试并不难。但是,如果您想要记录外观的测试,请查看快照测试。这可以在没有 XCUITestCase 的情况下完成。它比常规单元测试慢一个数量级,但可能比 UI 测试快另一个数量级。

除非你想把myText的访问级别从private放宽到internal(不指定就默认),没有direct 方式来测试它。

我必须间接测试的唯一建议是使用 snapshot testing.

您可以编写两个快照测试,一个对应 MYViewModel 中的每个 .someValue 值。

另一种使视图的测试和可维护性变得简单的方法是引入 ViewConfiguration 值类型,遵循 humble view 模式。

基本上,您可以在 MYViewModelMyCell 之间有一个 struct 来描述 MyCell 的每个视图属性。

struct MyCellViewConfiguration {
  let textFieldBackgroundColor: UIColor
}

extension MYViewModel {

  var viewConfiguration: MyCellViewConfiguration = {
    return MyCellViewConfiguration(
      textFieldBackgroundColor: someValue ? .red : .clear
    )
  }
}

extension MyCell {

  func setup(with configuration: MyCellViewConfiguration) {
    myText.backgroundColor = configuration.textFieldBackgroundColor
  }
}

setup(with configuration: MyCellViewConfiguration) 中的代码非常简单——只是一个 1 对 1 的赋值——你无需测试就可以逃脱。

然后您可以编写测试 MyCellViewConfiguration 是如何从 MYViewModel 计算出来的。