2015-03-24 3 views
0

Мне пришлось написать единичный тест для существующего метода, который отображает перечисление на другое перечисление. Этот модульный тест касается сценария, когда сопоставление не определено в методе, и мы получаем исключение в блоке по умолчанию оператора switch.Ожидаемое ограничение атрибута исключения в Visual Studio Unit Test

enum players{sachin, ponting, mculum, gayle} 
enum teams{westindies, australia, india, newzealand, southafrica} 

public teams MappingMethod(players p) 
{ 
    switch(p) 
    { 
    case sachin: return india; 
    case gayle: return westindies; 
    ...... 
    default: throw new ArgumentOutOfRangeException(); 
    } 
} 

Я попробовал модульный тест с атрибутом ExpectedException, и модульный тест работал нормально, когда у нас был вышеупомянутый сценарий. Но это не удается, когда отображение существует для всех элементов в перечислении.

Чтобы исправить это, я использовал блок try..catch внутри модульного теста и использовал Assert.IsInstanceOfType для проверки исключения вместо использования атрибута ExpectedException.

Есть ли другой лучший способ проведения тестирования этого устройства?

+0

Возможно, переосмыслить то, что вы на самом деле пытаетесь проверить в своем модульном тесте? Если вы используете «ExpectedException», это буквально означает, что вы ожидаете, что тест выдаст исключение. Если он иногда бросает, а иногда нет, то это не «ожидается». Например, в своем модульном тесте вызовите MappingMethod с тем, что, как вы знаете, будет бросать. – MariusUt

+0

Его единичный тест, который должен получить отказ, когда разработчик добавляет элемент в перечисление и забывает или пропускает обновление MappingMethod. Поскольку это невозможно всегда, какой подход вы предлагаете, кроме try..catch –

ответ

0

Кажется, что вы хотите достичь - это способ гарантировать, что каждый элемент в первом перечислении должен соответствовать элементу в другом. То есть, вы хотите, чтобы MappingMethod всегда преуспевал. Если это так, то я могу предположить, что вам может не понадобиться ExpectedException. Как насчет написания теста, который выполняет итерации по всем элементам в Players и вызывает MappingMethod для каждого из них? Этот тест потерпит неудачу, если есть игроки, которые не отображаются.

В дополнение к этому вы можете написать тест, который проверяет, что ожидаемое исключение возникает при получении недопустимых данных. Что-то вроде этого:

[TestMethod] 
[ExpectedException(typeof(ArgumentOutOfRangeException))] 
public void Throw_Exception_When_Mapping_Does_Not_Exist() { 
    MappingMethod((Players)-1); 
} 

Возьмите этот точный код с щепоткой соли - если я не ошибаюсь, ((Players)-1) даст вам объект типа Players, который не соответствует любому элементу в фактическом перечислении (если, конечно, вы не назначили такое значение). Таким образом, вызов MappingMethod, безусловно, потерпит неудачу.

Кстати, я хотел бы добавить, что я не уверен, что использование перечислений подходит для случая yoru. Как правило, когда перечисления заставляют вас использовать какой-то оператор switch, это запах кода, и вы должны вместо этого изменить перечисление на класс. Перечисления обычно используются для представления простых статических и ограниченных данных. Я подозреваю, что Players должен быть классом вместо enum. Рассмотрим структуру, как:

class Player { 
    public Teams Team { get; private set; } 
    public string Name { get; private set; } 

    public Player(string Name, Teams team) { /* set properties */ } 
} 

Тогда вы бы игрок sachin = new Player("Sachin", Teams.India). Это гарантирует, что каждый игрок связан с командой. Кроме того, он более динамичен, так как вы можете добавить больше игроков позже, и вы можете добавить больше статистики для каждого игрока и т. Д.

Надеюсь, это поможет. Имейте хороший день :)