加载夹具 xml 文件中的 xml 字段 (phpunit)

loading xml field in a fixture xml file (phpunit)

我正在使用 phpunit 并通过固定装置加载数据,现在在一种情况下,我的 table 中有一列仅接受 xml 数据,但我无法传递任何 xml 通过 fixtures 文件中的字段获取数据。

我尝试过的:

<?xml version="1.0"?>
<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<database name="phpunit">
    <table_data name="testtable">
        <row>
            <field name="name">My Test</field>
            <field name="active">1</field>
            <field name="xml_order">
                <Attributes>
                    <Attribute>                   
                        <Option Value="A">A1</Option>
                        <Option Value="B">B1</Option>
                        <Option Value="C">C1</Option>                               
                    </Attribute>
                </Attributes>
            </field>
        </row>
    </table_data>
</database>

我无法将字段 "xml_order" 数据加载到 dB。尝试寻找解决方案但无法找到。谁能帮我解决这个问题?我只想在这个 xml 中加载它,而不是在我的测试文件中

因为 <Attributes/> 是 xml fixture 文件中的常规 xml,当 dbunit 读取它时它会

// a bit simplified
// please visit https://github.com/sebastianbergmann/dbunit/blob/master/src/DataSet/MysqlXmlDataSet.php to get more details
$column = $rowElement->xpath('./field[@name="' . $columnName . '"]');
$columnValue = (string) $column;

它的文本值是一串空 space 字符。实际上,这对于 xml 来说是正常的。为了克服这个问题,你可以在 CDATA 中包装所有 xml 你希望在值提取期间被视为字符串的东西:

<field name="xml_order">
    <![CDATA[
        <Attributes>
            <Attribute>                   
                <Option Value="A">A1</Option>
                <Option Value="B">B1</Option>
                <Option Value="C">C1</Option>                               
            </Attribute>
        </Attributes>
    ]]>
</field>

另请注意,实际字符串在实际 xml 字符串前后仍有大量 space 和换行符。由于某些原因,我不希望这样做:

<field name="xml_order"><![CDATA[<Attributes>
    <Attribute>                   
        <Option Value="A">A1</Option>
        <Option Value="B">B1</Option>
        <Option Value="C">C1</Option>                               
    </Attribute>
</Attributes>]]></field>

虽然看起来不太好,但不会给你之前或之后的 spaces。

作为替代方案,您可以考虑使用 array based dataset:

// or it could be \PHPUnit_Extensions_Database_DataSet_ArrayDataSet
// depending on the dbunit version you use
return new PHPUnit\DbUnit\DataSet\ArrayDataSet([
    'testtable' => [
        ["name" => "MyTest", "active" => 1, "xml_order" => '<what><ever>xml</ever></what>'],
    ]
]);