Как выполнить модульное тестирование класса, который читает файл XML? - PullRequest
6 голосов
/ 13 июня 2010

Мне нужно написать модульные тесты для класса, который читает XML-файл и анализирует его содержимое. Как я могу издеваться над чтением файла? Потому что все содержимое тестов должно быть против прочитанного файла.

Я использую nmock2 с nUnit.

Спасибо

Ответы [ 2 ]

7 голосов
/ 13 июня 2010

Как предполагает 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?

3 голосов
/ 13 июня 2010

Все, что вам нужно сделать, - это найти способ рассказать вашему классу, какой файл читать.Так что это немного зависит от того, как реализован ваш класс.Самый простой подход будет выглядеть примерно так:

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

...