如何使用XQSuite在eXist-db中测试复杂的函数

时间:2016-03-15 12:02:18

标签: unit-testing xquery exist-db

我想为我的应用程序使用测试。我检查了文档以及A. Retter书中的特定章节。但是,我不知道如何使用其他类型的参数(尤其是节点)。我的函数通常比转换数字或字符串的函数高得多。

例如,我想测试一个以文档(节点)作为参数并返回a)HTML文件的函数; b)pdf文件。

测试功能(这里我尝试测试上面提到的第一个功能):

xquery version "3.0";

module namespace cust = 'http://46.28.111.241:8081/exist/db/apps/karolinum-x/modules/cust';

declare namespace tei  = 'http://www.tei-c.org/ns/1.0';
declare namespace test = 'http://exist-db.org/xquery/xqsuite';
declare
    %test:args('<TEI xmlns="http://www.tei-c.org/ns/1.0">
                    <text>
                        <body>
                            <div n="1">
                                <head>Heading</head>
                                <p>paragraph</p>
                            </div>
                        </body>
                    </text>')
    %test:assertXPath('$result/html')
function cust:transform($doc as node()*) as node() {
    let $styles := doc('/db/apps/karolinum-x/resources/xslt/style-web.xsl')
    let $document := 
        (
            <book n='1'>{($doc//tei:div[@n='1'])[1]}</book>
        )
    let $finale := transform:transform($document, $styles, ())
    return $finale
};

测试跑步者:

xquery version "3.0";

import module namespace test = 'http://exist-db.org/xquery/xqsuite' at 'resource:org/exist/xquery/lib/xqsuite/xqsuite.xql';

test:suite(inspect:module-functions(xs:anyURI('test-test.xqm')))

结果:

<testsuites>
    <testsuite package="http://46.28.111.241:8081/exist/db/apps/karolinum-x/modules/cust" timestamp="2016-03-15T12:53:16.5+01:00" failures="0" pending="0" tests="1" time="PT0.002S">
        <testcase name="transform" class="cust:transform">
            <error type="err:XPTY0004" message="It is a type error if,
                during the static analysis phase, an expression is found to have a
                static type that is not appropriate for the context in which the
                expression occurs, or during the dynamic evaluation phase, the dynamic 
                type of a value does not match a required type as specified by the 
                matching rules in 2.5.4 SequenceType Matching."/>
        </testcase>
    </testsuite>
</testsuites>

1 个答案:

答案 0 :(得分:2)

好的两件事:

  1. 您错过了通过</TEI>注释注入的XML中的结束%test:args

  2. 您似乎在XQSuite中发现了一个错误。我可以确认在%test:args中使用带有没有显式类型或显式类型node()的函数参数的XML不起作用。你能否在https://github.com/exist-db/exist/issues上为此开一个问题。如果您将$doc as node()*更改为$doc as element()*,那么解决方法似乎有效。

  3. P.S。您的测试看起来有点脆弱,因为您在测试中对数据库文档的路径进行了硬编码,更好地注入路径,甚至更好,以避免在函数内部使用doc()和collection()这样的副作用函数正在测试中。