2013-04-05 2 views
1

Я в недоумении, как даже начать создавать тесты для этого метода:Как один модуль тестирует XML-документ?

public override void ModifyXmlDocument(Foo foo, string nodeToChange, string newValue) 
{ 
    XmlDocument xmlDocument = new XmlDocument(); 
    xmlDocument.Load(foo.XmlPathAndFileName); 
    XmlElement rootElement = xmlDocument.DocumentElement; 
    // rest of method (to modify an XML doc) here 
} 

Этот метод просто находит элемент/узел в XML-документ и обновляет его с поставляемого пользователем значения. (Метод более сложный, чем то, что показано здесь.)

Часть, с которой мне сложно работать, заключается в понимании того, как этот метод выполняется, не полагаясь на жесткий диск. Но xmlDocument.Load() берет путь к файлу и загружает файл с диска. В конце метода он сохраняет обновленный файл обратно на диск.

Как я могу сделать эту единицу метода проверяемой?

ответ

6

Есть несколько способов, которыми вы можете это сделать, но для этого требуется рефакторинг вашего кода. ModifyXmlDocument в качестве параметра необходимо принять XmlDocument, то вы можете издеваться над ним там.

public void test_that_xml_is_loaded() 
{ 
    var sut = new SUT(); 
    var xmldocumentfake = new Mock<XmlDocument>(){CallBase=true}; 
    xmldocumentfake.Setup(x=>x.LoadXml(It.IsAny<String>())); 

    sut.ModifyXmlDocument(foo, nodeToChange, newValue, xmlDocumentfake.Object); 

    xmldocumentfake.Verify(x=>x.LoadXml(It.IsAny<String>()), Times.Once()); 
} 

Вы также можете обернуть XmlDocument в другой класс, который вы можете написать как абстракция, которая может быть изменена. Опять же, вам придется пройти его, хотя.

Кроме того, как упоминал Энтони Пегем и что я имею в виду: будьте осторожны, чтобы вы не нарушили Single Responsibility Principle. Когда тесты слишком сложно писать, это часто крик, что вы нарушили этот принцип.

+0

+1 Мне нравятся оба варианта, и я попробую их. Где ответ Энтони? Я думал, что он сделал хороший момент. –

+0

Он удалил его, поскольку это было в значительной степени именно то, что я говорил. Как только у вас есть 10k + очков, вы можете увидеть удаленные ответы –

+0

Спасибо. Какую издевательскую структуру вы используете в своем примере? Это похоже на Moq. Я использовал Moq, но не в пути (пока), который вы показали. –

1

Несколько вариантов:

  • Если вы используете VS2012 Ultimate, вы можете использовать Фальшивки, чтобы создать прокладку, которая будет переопределять поведение, когда XmlDocument открывает файл.
  • При тестировании разверните образец XML-файла с помощью модульных тестов. Затем при передаче в экземпляр Foo используйте путь к этому файлу.
  • Попробуйте один из альтернатив XmlDocument.Load, например, тот, который принимает поток или XmlReader. Затем создайте это с помощью метода, который вы можете переопределить.
+0

+1 Спасибо за советы; Я попробую # 1. Я думал о # 2, но файл был бы прочитан только на диске и потерпел неудачу при сохранении, и я бы не хотел, чтобы он все равно сохранялся. –

+1

Будьте осторожны при вызове некоторых из этих модульных тестов. Особенно вариант № 2 ... когда вы нажимаете другие зависимости, тогда вы являетесь интеграционным тестированием. Нет проблем с этим, но имейте в виду, что вы пишете, и скорость и компромиссы –

Смежные вопросы