c# - 如何对 FileStream 的 File.Open 进行单元测试

标签 c# unit-testing

首先,我熟悉 Mocking for Unit Tests 的概念,我正在根据 TDD 编写应用程序。

我确实有一个方法,我需要在其中读取一个文件。 读入一个文件:

 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 的接口(interface),它只有一个方法:

Stream Create(string filePath);

这个接口(interface)的实现是这样的:

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

所以,现在我可以模拟接口(interface)返回一个 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)));

问题是当我对 reader 进行单元测试时 null 并且应用程序中没有返回任何 nodes

有人知道哪里出了问题吗?

最佳答案

这里测试的问题是你有一个方法做两件事:

  1. 打开并阅读文件的内容。

  2. 从 XmlDocument 中读取您需要的节点。

您可能真正想要在这里测试的是您从特定文档中获得预期的节点集。如果你像这样拆分你的方法,那么它可能更容易测试,而且你也有一个只有单一责任的方法。您可以单独对您的加载程序类进行单元测试,然后检查您的 xml 节点阅读中的逻辑:

class
{   

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

    }
}

关于c# - 如何对 FileStream 的 File.Open 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30801255/

相关文章:

c# - EF Core 规范模式添加所有列以使用自定义规范对数据进行排序

javascript - 使用 React、Enzyme、Jest 测试嵌套 div 中是否存在特定链接

c# - 如何伪造 C# 单元测试中内置方法的返回?

c# - 无法在 IHostingStartup 中进行额外配置?

c# - C#/dot-NET 的字体渲染库?

C# 随机并一张一张地显示图片

c# - 使用 File.Open(参数和 File.Read(path).Last()

c# - WPF Prism 中的单元测试确认

php - Laravel 4 中的模拟回调(Mockery)

c# - 如何使用内部异常对代码进行单元测试?