Как выполнить модульный тест класса, который читает XML-файл?
Мне нужно написать модульные тесты для класса, который читает XML-файл и анализирует его содержимое. Как я могу издеваться над чтением файла? Потому что весь контент тестов должен быть против прочитанного файла.
Я использую nmock2 с nUnit.
Спасибо
2 ответа
Как полагает rwwilden, жизнь намного проще, если вы используете API на основе потоков, а не на основе имен файлов. Использование насмешек здесь не очень уместно, ИМО; вы не проводите "тестирование протокола" - вам просто нужен источник данных.
Вы также можете предоставить перегрузку, которая является простым служебным методом:
public Result ParseXml(string file)
{
using (Stream stream = File.OpenRead(file))
{
return ParseXml(stream);
}
}
Тогда вы могли бы достаточно безопасно не тестировать этот метод - в конце концов, он не имеет существенной логики.
Теперь вы можете протестировать API на основе потоков, используя жестко запрограммированную строку в своем коде, а затем вызвать Encoding.UTF8.GetBytes(xml)
и строит MemoryStream
вокруг полученного байтового массива... но я обычно предпочитаю использовать отдельные файлы данных в моем тестовом проекте. Установите тип содержимого "встроенный ресурс", а затем используйте Assembly.GetManifestResourceStream
получить поток в тестовый файл.
Если это действительно обычный XML-файл, действительно ли вы хотите выполнить синтаксический анализ самостоятельно? Есть ли причина, по которой вы не хотите оставлять это на усмотрение платформы и выражать свой API в терминах DOM API, LINQ to XML или XmlReader
?
Все, что вам нужно сделать, - это найти способ сообщить вашему классу, какой файл читать. Так что это немного зависит от того, как реализован ваш класс. Самый простой подход будет выглядеть примерно так:
public class ClassToTest : IClassToTest
{
public Result ParseXml(Stream xml)
{
// Parse xml and return result.
return ...;
}
}
[Test]
public void TestParseXml()
{
// Get xml stream to test from somewhere.
Stream xmlStream = ...;
// Call method to test.
var result = new ClassToTest().ParseXml(xmlStream);
// Assert results.
Assert.IsNotNull(result);
...
}
Идея состоит в том, что вы каким-то образом предоставляете классу, который вы тестируете, созданный вами XML-файл, для которого вы знаете, какие результаты анализа ожидать.