我有一个包含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的背景颜色设置为清除?
除非你想放宽从myText
到private
的internal
的访问级别(如果你没有指定它,默认情况下),没有直接的方法来测试它。
我必须间接测试的唯一建议是使用snapshot testing。
您可以编写两个快照测试,一个用于.someValue
中MYViewModel
的每个值。
使视图的测试和可维护性变得简单的另一个选择是引入ViewConfiguration
值类型,遵循humble view模式。
基本上,您可以在struct
和MYViewModel
之间使用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
计算。
只需从您的声明中删除private
即可。然后访问控制将是默认的internal
。在测试代码中,请确保使用@testable import
以获得对内部功能的访问权限。
单元测试一些属性并不难。但是,如果您想要一个记录外观的测试,请查看快照测试。这可以在没有XCUITestCase的情况下完成。它比常规单元测试慢一个数量级,但可能比UI测试快一个数量级。