如何使用间谍单元测试textView

问题描述 投票:0回答:2

我有一个包含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的背景颜色设置为清除?

swift unit-testing mocking stub spy
2个回答
1
投票

除非你想放宽从myTextprivateinternal的访问级别(如果你没有指定它,默认情况下),没有直接的方法来测试它。

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

您可以编写两个快照测试,一个用于.someValueMYViewModel的每个值。

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

基本上,您可以在structMYViewModel之间使用MyCell来描述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计算。


0
投票

只需从您的声明中删除private即可。然后访问控制将是默认的internal。在测试代​​码中,请确保使用@testable import以获得对内部功能的访问权限。

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

© www.soinside.com 2019 - 2024. All rights reserved.