Как выполнить модульный тест класса, который читает 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-файл, для которого вы знаете, какие результаты анализа ожидать.

Другие вопросы по тегам