我正在尝试对XML结构的修改进行单元测试,如:
<element1>
<open file="otherfile.xml">
</element1>
假设otherfile.xml
包含:
<element2>
<open file="anotherfile.xml">
<happytag/>
</element2>
那anotherfile.xml
看起来像是:
<element3>
<sadtag/>
</element3>
正确的修改会将要打开的文件中的代码复制并粘贴到调用open
标记的代码中。因此,我期待的结构如下:
<element1>
<element2>
<element3>
<sadtag/>
</element3>
<happytag/>
</element2>
</element1>
我遇到的问题是我不确定如何进行单元测试以创建此结构。理想情况下,我尝试过的(不成功)是创建此单元测试,以便我不需要对文件系统进行任何调用以创建结构。为此,我创建了一个模拟对象,假装是一个打开文件的输入流,但实际上只是返回从
文本创建的流<element1>
<open file="otherfile.xml">
</element1>
我在这种方法中遇到的问题是我无法想出一种方法来注入otherfile.xml
的文本,以便模拟对象将返回以下文本:
<element2>
<open file="anotherfile.xml">
<happytag/>
</element2>
我尝试过的另一件事是将anotherfile.xml
的文字放入open file=""
,例如open file="<element3>...</element3>">
。这不起作用,因为XML解析器抱怨它不是有效的XML。
我还可以在运行测试之前从字符串创建这些xml文件,然后在测试后删除它们。
答案 0 :(得分:1)
创建文件访问器接口,然后提供两个实现。一个实现实际上打开文件系统上的项目。另一个实现访问存储在对象内的映射中的数据。
所以你的测试对象的构造如下:
file_data = {
"otherfile.xml": "<element2>\n <open file=\"anotherfile.xml\">\n <happytag/>\n</element2>",
"anotherfile.xml": "<element3>\n <sadtag/>\n</element3>"
}
accessor = TestFileAccessor(file_data)