我正在为我的班级编写单元测试。这个类在一些private
变量中保留其状态(我不想公开公开)。所以场景是:
private
属性中并调用一个带有一些结果的委托方法。我希望涵盖测试中的所有案例。
但这两种方式对我来说都很尴尬,我不确定最好的方式。 为这门课程编写单元测试的最佳方法是什么?
protocol ZoneUpdateDetectorOutput: class {
func updateZoneState(_ state: ZoneState)
}
class ZoneUpdateDetector {
var zoneChangeTimer: TimerProtocol?
weak var delegate: ZoneUpdateDetectorOutput?
private var previousZoneState: ZoneState?
private var expectedZoneState: ZoneState?
private func updateZoneState() {
// If `expectedZoneState` is not equal to `previousZoneState` then `delegate` will be called
// Otherwise it will just skip
if expectedZoneState != previousZoneState {
delegate?.updateZoneState(expectedZoneState!)
previousZoneState = expectedZoneState
}
}
private func runNotifyZoneStateTimer() {
guard zoneChangeTimer?.isValid() == false else {
return
}
zoneChangeTimer?.start(timeInterval: 5,
onFire: { [weak self] in
guard let strongSelf = self else {
return
}
// On timer fire, it will try to update the state
strongSelf.updateZoneState()
})
}
// When zone changes, this method is invoked
// I basically want to test this method
func zoneStateChanged(_ state: ZoneState) {
expectedZoneState = state
if state != .inZone {
runNotifyZoneStateTimer()
} else {
zoneChangeTimer?.stop()
}
}
}
答案 0 :(得分:2)
你永远不应该测试内部状态;您应该只测试外部(公开)可见行为。这样,您可以在不违反任何合同的情况下更改班级的实施细节,从而不会破坏任何测试。
所以第二个选项是首选。
答案 1 :(得分:0)
在与一些专家进行研究和讨论之后,我想出了一个解决方案,如果我们想测试一个保留状态的类,那么保留状态的功能应该在一个单独的类下。这与将变量设置为私有的目的相同。因此,ZoneUpdateDetector
应该具有依赖关系,例如:ZoneUpdateStatePreserver
并且它应该保留以前在ZoneUpdateDetector
内的状态