2014-10-01 2 views
2

Я тестирую свое приложение на C#, которое анализирует CSV. Я на покрытие кода 94%, потому что я не могу заставить его провалить попробовать/поймать блоков ... Я использую CsvHelper из NuGet http://joshclose.github.io/CsvHelperFail try/catch block csv

public void ParseCsv([FromBody] string csvText) 
{ 
    var parseCsv = new XsvData(new[] { "\t", "," }); 
    try 
    { 
     using (var reader = new XsvReader(new StringReader(csvText))) 
     { 
      parseCsv.Read(reader, headerExists: true); 
     } 
    } 
    catch (Exception) 
    { 
     var response = new HttpResponseMessage(HttpStatusCode.BadRequest) 
     { 
      Content = new StringContent("Unable to read CSV."), 
      ReasonPhrase = "Invalid CSV" 
     }; 

     throw new HttpResponseException(response); 
    } 
} 

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

[TestMethod] 
//[ExpectedException(typeof(HttpResponseException))] 
public void TestUploadCsv_UploadingCsvNonCsv() 
{ 
    const string csvText = "[email protected] [email protected] fjkqeqir%[email protected] ujewqh$phfuw \n hfwu- ihfq&if*[email protected] afuhwu- [email protected]"; 
    var context = GetMyFakeEntityDatabase(); 
    var controller = new MyController(context); 
    controller.ParseCsv(csvText); 
} 

После попытки/улов блоков, у меня есть раздел, который претворяет существует все заголовки, и он не работает, но для этого примера он должен быть неудачным во время чтения. Как заставить мой модульный тест сбой? Любая помощь приветствуется! Заранее спасибо.

+0

+1 для проверки того, как код обрабатывает сбои. –

+1

Вы можете передать 'null' для' csvText'. – juharr

+0

@juharr Как это написано в настоящее время, это сработает, но это не очень общее решение. Что делать, если он хочет иметь разные коды статуса для пустой/пустой строки против недействительного синтаксиса. –

ответ

0

Я решил это, просто передав его null, как рекомендовал juharr в комментариях.

0

Используйте шаблон поставщика и интерфейсы вместо конкретных типов, затем запустите свои модульные тесты, заменив макет объектов, которые будут генерировать исключения.

Подробно:

  • Извлечение интерфейс IXsvReader из XsvReader
  • Реализовать новый конкретный экземпляр IXsvReader, генерирующие исключения на Read. Создайте один конкретный класс реализации для каждой ошибки, которую вы планируете обрабатывать отдельно (в этом случае вам нужен только один).
  • В классе, который содержит метод ParseCSV, есть свойство для IXsvProvider, которое можно установить. В конструкторе для этого же класса установите это свойство поставщику по умолчанию, который вернет «реальный» читатель. Этот интерфейс имеет только один метод: GetXsvReader(string text)
  • В вашем тестовом классе новый класс с функцией ParseCSV, затем введите IXsvProvider (s), который возвращает ваш «фиктивный» IXsvReader, который просто генерирует исключения, когда вы пытаетесь использовать метод ,
0

Вы должны использовать Inversion of Control и вводить зависимость в контроллер вместо создания его в действие контроллера. Таким образом, вы можете издеваться над читателем и заставить его бросить вместо этого.

Я собираюсь написать этот пример в терминах CsvHelper, так как это то, что вы говорите, что используете, хотя пример не похож на него.

Грубо:

public class MyController : Controller 
{ 
    private readonly ICsvReader csv; 

    public MyController(ICsvReader csv) 
    { 
     this.csv = csv; 
    } 
} 

public class CsvReaderMock : ICsvReader 
{ 
    public void Read() 
    { 
     throw new Exception(); 
    } 
} 

Теперь вы можете использовать макет ICsvReader при тестировании, и он будет бросать исключение.

Также вы должны проверять только один метод. Если у вашего метода есть зависимости, вы должны передавать их вместо их создания, чтобы вы могли тестировать только код в этом методе, а не классы, которые он создает.

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