У меня есть метод расширения строки С#, который должен возвращать IEnumerable<int>
всех индексов подстроки внутри строки. Он отлично работает по назначению, и ожидаемые результаты возвращаются (как доказал один из моих тестов, хотя и не тот, который приведен ниже), но другой unit test обнаружил проблему с ним: он не может обрабатывать нулевые аргументы.
Здесь метод расширения, который я тестирую:
public static IEnumerable<int> AllIndexesOf(this string str, string searchText)
{
if (searchText == null)
{
throw new ArgumentNullException("searchText");
}
for (int index = 0; ; index += searchText.Length)
{
index = str.IndexOf(searchText, index);
if (index == -1)
break;
yield return index;
}
}
Вот тест, который помечен проблемой:
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void Extensions_AllIndexesOf_HandlesNullArguments()
{
string test = "a.b.c.d.e";
test.AllIndexesOf(null);
}
Когда тест выполняется против моего метода расширения, он терпит неудачу, со стандартным сообщением об ошибке, что метод "не выбрал исключение".
Это сбивает с толку: я ясно передал null
в функцию, но почему-то сравнение null == null
возвращает false
. Поэтому исключение не генерируется, и код продолжается.
Я подтвердил, что это не ошибка в тесте: при запуске метода в моем основном проекте с вызовом Console.WriteLine
в блоке if
с нулевым сравнением ничего не отображается на консоли, и никакое исключение не является пойманный любым блоком catch
, который я добавляю. Более того, использование string.IsNullOrEmpty
вместо == null
имеет ту же проблему.
Почему это якобы простое сравнение не удается?