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