Например, у меня есть следующий метод:Правильная работа с исключениями
public void MeetingNoteSave(int MeetingID, string note, bool IsInviter, string Username)
{
meeting = Get<Meeting>(p => p.MeetingID == MeetingID && p.UserInviter.aspnet_User.UserName == Username);
MeetingNoteSaveCheckings(meeting, MeetingID);
// some actions here
}
void MeetingNoteSaveCheckings(Meeting meeting, int MeetingID)
{
DateTime currentDateWithTime = DateTime.Now;
if (meeting == null)
{
throw new Exception("Meeting does not exist. MeetingID=" + MeetingID);
}
DateTime meetingTime = meeting.MeetingTime.Day.AddHours(meeting.MeetingTime.Hour).AddMinutes(meeting.MeetingTime.Minute);
if (meetingTime > currentDateWithTime)
{
throw new Exception("Meeting is future. MeetingID=" + MeetingID + ". Meeting time = '" + meetingTime + "', Current time='" + currentDateWithTime + "'");
}
}
так, метод может бросить 2 исключения - при встрече не существует с такими параметрами на всех или когда время встречи более чем текущее время (должен быть прошлым или текущим).
Теперь, я пишу Unit Tests. Простой метод:
[TestMethod]
public void MeetingNoteSave()
{
_repository.MeetingNoteSave(1, "My note", true, "[email protected]");
}
Разумеется, тест модуля вызова будет терпеть неудачу с некоторыми параметрами. Я хочу поймать эти случаи, поэтому тест должен быть успешным. Я могу сделать двумя способами. Во-первое это просто, но немного грязный:
try
{
_repository.MeetingNoteSave(1, "My note", true, "[email protected]");
}
catch(Exception ex)
{
if (ex.Message.IndexOf("Meeting does not exist")>=0)
{
// some actions
}
if (ex.Message.IndexOf("Meeting is future")>=0)
{
// some actions
}
}
так, тест будет успешный с неверными параметрами ввода (так, блок тест может быть использован для проверки методы с неправильными параметрами), но не с встречающимися ошибками. Хорошо.
Другой способ - создать специальные исключения фиктивных как MeetingNullException и MeetingFutureException
public class MeetingNullException : Exception
{
}
public class MeetingFutureException : Exception
{
}
бросить их и поймать их. Вернее, но гораздо больше кода. Манекен-код. Какой путь вернее?
спасибо. Кроме того, вы можете показать мне свой подход с помощью ArgumentException? –
Это то же самое, что и выше, только вы используете '[ExpectedException (typeof (ArgumentException))] и' throw new ArgumentException («meeting»); '. Затем импортируется имя метода: SaveMeetingNote_WithNullMeeting_ThrowsArgumentException' и аргументы: '_repository.SaveMeetingNote (VALID_ID, INVALID_NAME, VALID_ISINVITED, VALID_EMAIL);' которые являются константами, которые вы определяете до этого. Тогда нет вопроса о том, что вы имели в виду. –