2017-01-20 6 views
2

Итак, это немного неловко о Swift, поскольку я пытаюсь достичь 100% -ного охвата кода в своих тестах, но Swift требует строки кода, которая никогда не будет достигнута по дизайну.Swift Switch Случай по умолчанию, который никогда не будет выполнен.

Код обижая:

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), но нет никакого способа, чтобы написать тест против случая по умолчанию.

Что лучше всего делать в этом случае, чтобы получить полное тестовое покрытие?

+3

Мне любопытно, как много обходных способов игры, которые вы захотите реализовать в погоне за 100% -ным охватом для тестирования, прежде чем вы согласитесь с тем, как счетчик результативности – Alexander

+0

Было высказано предположение о 'switch!' Заявлении, которое имеет * implicit * 'default: fatalError()', см. https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20161003/027563.html. Насколько я понимаю, это вообще не одобрялось. –

+1

Рассматривая пример выше, вы сопоставляете целое число в диапазоне '0 .. <7' с вычислением (или даже исправлением-возвратом?) На основе значения целого числа в' 0 .. <7'. В случае, если это не просто пример, чтобы охватить вопрос о недоступном коде, вы можете захотеть реорганизовать эту функцию в нечто более кратким, но все еще имеет одно и то же семантическое значение. (Как рассчитывается «подходящее целое число»: s?) – dfri

ответ

1

Это лучшее решение, которое я могу думать:

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.

 Смежные вопросы

  • Нет связанных вопросов^_^