2014-01-31 4 views
4

У меня есть схемы XSD уже на следующий XML-файлКак протестировать XML-файл?

<?xml version="1.0"?> 
<note> 
<to> </to> 
<from> </from> 
<datetime> </datetime> 
<heading> </heading> 
<body> </body> 
</note> 

Я реализовал NoteGnerator для создания файлов XML на основе схемы. Файлы XML должны создаваемому в отношении некоторых шаблонов/спецификаций, таких как:

<?xml version="1.0"?> 
<note> 
<to> Lucy </to> 
<from> Lily </from> 
<datetime> --date--time-- </datetime> 
<heading> reminder </heading> 
<body> do not forget my pen </body> 
</note> 

Другой шаблон/спецификация будет, как:

<?xml version="1.0"?> 
<note> 
<to> Lily </to> 
<from> Lucy </from> 
<datetime> --date--time-- </datetime> 
<heading> reply </heading> 
<body> no problem </body> 
</note> 

, где <datetime> является динамическое значение, когда XML генерируется (так что это значение не может быть предопределено). Основываясь на схеме XSD и этих двух спецификациях XML, я могу легко генерировать XML-сообщения.

Как я могу протестировать сгенерированные файлы XML?

Нужно ли снова проверять сгенерированные XML-файлы схемы? Или мне нужно использовать некоторый инструмент сравнения для сравнения сгенерированных файлов xml и шаблона? Поскольку datetime является динамическим, каждый раз, когда генерируется XML-файл, он отличается, поэтому, как сравнить их с шаблоном? Или мне нужно deserialise xml to C# object, а затем проверить объект C#?

+2

Ваша схема XSD не является схемой XSD. См. Http://en.wikipedia.org/wiki/XML_Schema_%28W3C%29 о том, как выглядит схема. Он должен начинаться с ''. –

+0

Да, это не схема. что я имел в виду, так это то, что у меня есть схема для этого xml-файла. – user3118189

+0

Что именно вы хотите выполнить модульный тест? –

ответ

1

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

  • удаления индетерминизма вообще
  • ослабив свои требования, относящиеся к индетерминизму (например, не выполняя точное соответствия, но а какое-то нечеткий/аппроксимируется один)

с первым решением, записные генерациями компоненты будет необходимо абстрагировать из текущего времени даты для внешнего обслуживания/зависимости, скажет:

public class NoteGenerator 
{ 
    private readonly ICurrentDateProvider currentDateProvider; 
    public NoteGenerator(ICurrentDateProvider)currentDateProvider 
    { 
     this.currentDateProvider = currentDateProvider; 
    } 

    public string GenerateNote() 
    { 
     var currentDate = currentDateProvider.Now; 
     // ... 

Сейчас в тестовом модуле вы можете поддельной эту зависимость с помощью рамки изоляции выбора и выполнения утверждений против детерминированной значения вы поставили перед собой (пример с FakeItEasy):

var dateProvider = A.Fake<ICurrentDateProvider>(); 
A.CallTo(() => dateProvider.Now).Returns(new DateTime(2014, 01, 31, 10, 30)); 
var generator = new NoteGenerator(dateProvider); 

// ... 

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

var oneMinuteAgo = DateTime.Now.AddMinutes(-1.0); 
var generator = new NoteGenerator(); 

var dateFromXml = // extract 
Assert.That(dateFromXml, Is.GreaterThan(oneMinuteAgo)); 
+0

круто! Сейчас я попробую. Ура! – user3118189

2

Это может быть полезно для вас. В этом я создаю объект, назначая значения, записывая его в XML, читаю XML и сравнивая его с оригинальным объектом. Я предполагаю, что у вас есть целая структура класса.

// This is your expected object which you are going to write to xml. 
var sourceObject = new SomeClassToWriteInXML(); 

// Writing object to XML. 
var document = new XDocument(); 
var serializer = new XMLSerializer(typeof(SomeClassToWriteInXML)); 
using (var writer = document .CreateWriter()) 
{ 
    serializer.Serialize(writer, source); 
} 
// write document to a file. 

// Now document has the XML document. 
// Need to read file you have just created. For testing sake I am reading document. 
var actual = new SomeClassToWriteInXML(); 
// Deserialize xml to get actual object (which should be equal to sourceObject) 
using (var reader = document.CreateReader()) 
{ 
    actual = (SomeClassToWriteInXML)serializer.Deserialize(reader); 
} 

Assert.AreEqual(expected.First(), actual.First()); 
+0

сколько вариантов использования вы можете протестировать без подготовки xml-файлов (с учетом ошибки), используя этот метод? – Ewoks

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