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

时间:2017-01-20 06:34:35

标签: swift unit-testing switch-statement

所以,这是关于Swift的一点挑剔,因为我试图在我的测试中达到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)提供一个大小写,但是没有办法针对默认情况编写测试。

在这种情况下,为了获得完整的单元测试覆盖率,最好的做法是什么?

1 个答案:

答案 0 :(得分:2)

这是我能想到的最佳解决方案:

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%的测试覆盖率问题。它有很多缺点。如果要添加新案例.seven,则必须在枚举和switch语句中添加新案例。