Swift Switch将永远不会执行的默认情况
所以,这有点吹毛求疵,因为我试图在测试中达到100%的代码覆盖率,但Swift需要一行设计永远无法达到的代码 违规代码:Swift Switch将永远不会执行的默认情况,swift,unit-testing,switch-statement,Swift,Unit Testing,Switch Statement,所以,这有点吹毛求疵,因为我试图在测试中达到100%的代码覆盖率,但Swift需要一行设计永远无法达到的代码 违规代码: func calculateWorkingOffset(_ offset: Int) -> Int { let translatedOffset = abs(offset) % 7 switch translatedOffset { case 0: return [appropriate_integer] case 1:
func calculateWorkingOffset(_ offset: Int) -> Int {
let translatedOffset = abs(offset) % 7
switch translatedOffset {
case 0:
return [appropriate_integer]
case 1:
return [appropriate_integer]
case 2:
return [appropriate_integer]
case 3:
return [appropriate_integer]
case 4:
return [appropriate_integer]
case 5:
return [appropriate_integer]
case 6:
return [appropriate_integer]
default:
fatalError("Should never be executed")
}
}
默认情况必须存在,因为Swift编译器要求类型的每个潜在值(在本例中为Int)都有一个情况,但无法针对默认情况编写测试
在这种情况下,要获得完整的单元测试覆盖率,最好的做法是什么?这是我能想到的最好的解决方案:
func calculateWorkingOffset(_ offset: Int) -> Int {
switch Offset(rawValue: abs(offset) % 7)! {
case .zero:
return [appropriate_integer]
case .one:
return [appropriate_integer]
case .two:
return [appropriate_integer]
case .three:
return [appropriate_integer]
case .four:
return [appropriate_integer]
case .five:
return [appropriate_integer]
case .six:
return [appropriate_integer]
}
}
// Please name this enum and its values appropriately. I called it
// Offset because I have no context of what you're doing
enum Offset: Int {
case zero
case one
case two
case three
case four
case five
case six
}
尽管这解决了100%测试覆盖率的问题。它有很多缺点。当你想添加一个新的案例时,你必须在enum和switch语句中添加一个新的案例。我很好奇,在你意识到如何适得其反之前,为了追求100%的测试覆盖率,你愿意实施多少棘手的变通方法这里有一个关于
切换的建议代码>语句,该语句具有隐式的默认值:fatalError()
,请参阅。据我所知,这并没有得到普遍认可。看看你上面的例子,你映射了一个0范围内的整数。Alexander:有一点,是的,完全覆盖是不必要的,但在这种情况下,它揭示了一种情况,即可能有其他方法来编写代码,正如其他人所建议的那样。还要注意的是,这个问题是对Swift编译器的一个吹毛求疵,Swift编译器做了很多其他直观的事情,但在这种情况下,它不理解开关中的值映射到某个范围。默认情况永远不会发生,那么我为什么需要编写它呢?这就引出了另外一系列问题。编译器是否应该能够识别这一点?它会永远吗?等