2015-06-12 3 views
4

Прежде всего, я знаком с концепцией Mocking for Unit Tests, и я пишу приложение в соответствии с TDD.Как скомпилировать файл FileStream File.Open

У меня есть метод, в котором мне нужно прочитать файл. Файл, читается:

using (var webshopXmlFileStream = StreamFactory.Create(importFile)) 
{ 
    // Opens a reader that will read the Xml file. 
    using (var reader = XmlReader.Create(webshopXmlFileStream)) 
    { 
     // Read the nodes "Node" and "ArticleGroup" recursively. 
     var nodes = XmlReaderUtils.EnumerateAxis(reader, new[] { "Node", "ArticleGroup" }); 
    } 
} 

Конечно, это не единичный тест-состоянии.

Таким образом, я создал интерфейс под названием IStreamFactory, который имеет один единственный метод:

Stream Create(string filePath); 

Реализация этого интерфейса выглядит следующим образом:

public Stream Create(string filePath) 
{ 
    return File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None); 
} 

Итак, теперь я могу издеваться интерфейс для возврата MemoryStream, например:

const string webshopXmlData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
           "<Node>" + 
            "<Name></Name>" + 
           "</Node>"; 
var streamFactoryMock = new Mock<IStreamFactory>(); 
streamFactoryMock.Setup(action => action.Create(It.IsAny<string>())).Returns((string input) => new MemoryStream(Encoding.ASCII.GetBytes(webshopXmlData))); 

Проблема в том, ru Я тестирую единицы измерения, reader - null, а nodes - в приложении.

У кого-нибудь есть идея, что случилось?

ответ

6

Ваша проблема здесь для тестирования является то, что у вас есть метод, который делает две вещи:

  1. Открыть и прочитать содержимое файла.

  2. Прочитайте необходимые узлы из XmlDocument.

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

class 
{ 

    void LoadNodes(IFileLoader loader) 
    { 
     using(var reader = loader.GetReader()) 
     { 
       var nodes = XmlReaderUtils.EnumerateAxis(reader, new[] { "Node", "ArticleGroup" }); 
     } 

    } 
} 
+0

Спасибо за разъяснение. Я принял это как ответ, потому что вы затронули хороший момент здесь, но проблема действительно заключается в моей строке Xml. Поэтому возвращаемые результаты были пустыми. – Complexity

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