首先,我熟悉 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
。
有人知道哪里出了问题吗?
最佳答案
这里测试的问题是你有一个方法做两件事:
打开并阅读文件的内容。
从 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/