Я действительно люблю способность NUnit new (er) тестировать ожидаемое тестирование исключений, т.е.
var ex = Assert.Throws<SomeException>(()=>methodToThrowException("blah"));
Одна из незначительных проблем, которые я нахожу, заключается в том, что для проверки некоторой перегрузки оператора или другой функции типа назначения единственный способ узнать, как это сделать, - дать компилятору переменную, которая будет назначаться, например:
// test division operator "/"
var ex = Assert.Throws<PreconditionException>(() => { var ignored = nbr / m; });
Это компактно и отлично работает, но раздражает, когда Resharper выдает предупреждение о том, что игнорируемая переменная никогда не используется. Это счетчик результативности, если вы хотите использовать визуализацию Resharper, чтобы помочь вам оценить качество кода с первого взгляда, как и я. Разумеется, решармер технически корректен, но есть ли способ сказать Решарперу, что это мое намерение? У меня есть тест с множеством подобных тестов, поэтому прагма будет выглядеть противно.
Любые предложения (кроме того, "справитесь с этим, чувак" )?
Приветствия
Добавьте поле в unit test и подавите предупреждение, то есть:
// ReSharper disable UnaccessedField.Local
private object _ignore;
// ReSharper restore UnaccessedField.Local
Использование этого поля в качестве переменной назначения в тестовом делетете:
// test division operator "/"
var ex = Assert.Throws<PreconditionException>(() => { _ignore = nbr / m; });
Это держит решара тихим, поэтому вы знаете, что он жалуется на что-то сейчас, скорее всего, это законная жалоба, на которую следует обратить внимание. Это устраняет уровень шума, поэтому вы можете сфокусироваться (у меня более 50 тестов, подобных этому в важном классе, который нуждается в некотором рефакторинге).
Cheers, Berryl
Вы можете написать свой собственный метод Throws
, который вместо этого примет Func<object>
, а затем просто напишет:
var ex = Assert.Throws<PreconditionException>(() => nbr / m);
Затем отправьте новый метод в NUnit и дождитесь следующего релиза:)
И это действительно опрятно, вы можете получить исключение и работать с ним...
var exception = Assert.Throws<ArgumentException>(() => dlinvalid.ProcessData());
Assert.That(exception.Message, Is.EqualTo("foo bar"), "Expected bar foo");
Плюс он работает с Resharper, тогда как ExpectedException
, похоже, терпит неудачу с NUnit 2.5