如何对XML文件的修改进行单元测试,该文件以递归方式指向其他XML文件?

时间:2010-12-16 16:31:54

标签: xml unit-testing

我正在尝试对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="&lt;element3&gt;...&lt;/element3&gt;">。这不起作用,因为XML解析器抱怨它不是有效的XML。

我还可以在运行测试之前从字符串创建这些xml文件,然后在测试后删除它们。

1 个答案:

答案 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)