Swift Switch将永远不会执行的默认情况

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:

所以,这有点吹毛求疵,因为我试图在测试中达到100%的代码覆盖率,但Swift需要一行设计永远无法达到的代码

违规代码:

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编译器做了很多其他直观的事情,但在这种情况下,它不理解开关中的值映射到某个范围。默认情况永远不会发生,那么我为什么需要编写它呢?这就引出了另外一系列问题。编译器是否应该能够识别这一点?它会永远吗?等