Проблема в том, что вы не делаете TDD. Сначала вы написали рабочий код, а теперь хотите его протестировать.
Сотрите весь этот код и начните снова. Сначала напишите тест, а затем напишите код, который проходит этот тест. Затем напишите следующий тест и т. Д.
Какова ваша цель? Учитывая строку, которая заканчивается на «xml» (почему не «.xml»?), Вам нужен поставщик данных XML, основанный на файле, именем которого является эта строка. Это твоя цель?
Первые тесты были бы вырожденным случаем. Учитывая строку типа "name_with_wrong_ending", ваша функция должна завершиться ошибкой Как это должно потерпеть неудачу? Должен ли он вернуть ноль? Или это должно вызвать исключение? Вы можете подумать об этом и принять решение в своем тесте. Затем вы делаете тестовый проход.
Теперь, как насчет такой строки: "test_file.xml", но в случае, когда такого файла не существует? Что вы хотите, чтобы функция делала в этом случае? Должен ли он вернуть ноль? Должно ли это бросить исключение?
Простейший способ проверить это, конечно, состоит в том, чтобы фактически запустить код в каталоге, в котором нет этого файла. Однако, если вы предпочитаете написать тест, чтобы он не использовал файловую систему (мудрый выбор), вам нужно задать вопрос «Существует ли этот файл», и тогда ваш тест должен заставить ответ быть "ложным".
Вы можете сделать это, создав новый метод в вашем классе с именем «isFilePresent» или «doFileExist». Ваш тест может переопределить эту функцию, чтобы вернуть «ложь». И теперь вы можете проверить, что ваша функция LoadFile работает правильно, когда файл не существует.
Конечно, теперь вам нужно проверить, что нормальная реализация isFilePresent работает правильно. И для этого вам придется использовать настоящую файловую систему. Однако вы можете не допустить тестов файловой системы в свои тесты LocalizationData, создав новый класс с именем FileSystem и переместив метод isFilePresent в этот новый класс. Затем ваш тест LocalizationData может создать производную от этого нового класса FileSystem и переопределить isFilePresent для возврата false.
Вам все еще нужно протестировать обычную реализацию FileSystem, но это в другом наборе тестов, которые запускаются только один раз.
ОК, какой следующий тест? Что делает ваша функция loadFile, когда файл существует , но не содержит действительный xml? Должно ли это сделать что-нибудь? Или это проблема для клиента? Вам решать. Но если вы решите проверить это, вы можете использовать ту же стратегию, что и раньше. Создайте функцию с именем isValidXML и сделайте так, чтобы тест переопределил ее для возврата false.
Наконец, нам нужно написать тест, который фактически возвращает XMLDataProvider. Итак, последняя функция, которую loadData должен вызывать, после всех этих других функций, createXmlDataProvider. И вы можете переопределить это, чтобы вернуть пустой или фиктивный XmlDataProvider.
Обратите внимание, что в своих тестах вы никогда не переходили на настоящую файловую систему и действительно создавали XMLDataProvider на основе файла. Но то, что вы сделали , это проверка каждого оператора if в вашей функции loadData. Вы проверили функцию loadData.
Теперь вам нужно написать еще один тест. Тест, который использует настоящую файловую систему и настоящий действительный файл XML.