如何使用 XQSuite 测试 eXist-db 中的复杂函数
How to test complex functions in eXist-db with XQSuite
我想对我的应用进行测试。我已经检查了文档以及 A. Retter 书中的特定章节。但是,我不知道如何使用其他类型的参数(尤其是节点)。我的功能通常比那些转换数字或字符串的功能要高得多。
例如,我想测试一个以文档(节点)作为参数和 returns 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>
好吧,有两件事:
您在通过 %test:args
注释注入的 XML 中缺少结尾 </TEI>
。
您似乎发现了 XQSuite 中的错误。我可以确认在您的 %test:args
中使用 XML 以及没有显式类型或 node()
显式类型的函数参数不起作用。你能在 https://github.com/exist-db/exist/issues 上为此打开一个问题吗?作为解决方法,如果您将 $doc as node()*
更改为 $doc as element()*
那么这似乎确实有效。
p.s。您的测试似乎有点脆弱,因为您在测试中对数据库文档的路径进行硬编码,最好注入路径,甚至更好,以避免在函数中产生副作用,例如 doc() 和 collection()正在测试中。
我想对我的应用进行测试。我已经检查了文档以及 A. Retter 书中的特定章节。但是,我不知道如何使用其他类型的参数(尤其是节点)。我的功能通常比那些转换数字或字符串的功能要高得多。
例如,我想测试一个以文档(节点)作为参数和 returns 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>
好吧,有两件事:
您在通过
%test:args
注释注入的 XML 中缺少结尾</TEI>
。您似乎发现了 XQSuite 中的错误。我可以确认在您的
%test:args
中使用 XML 以及没有显式类型或node()
显式类型的函数参数不起作用。你能在 https://github.com/exist-db/exist/issues 上为此打开一个问题吗?作为解决方法,如果您将$doc as node()*
更改为$doc as element()*
那么这似乎确实有效。
p.s。您的测试似乎有点脆弱,因为您在测试中对数据库文档的路径进行硬编码,最好注入路径,甚至更好,以避免在函数中产生副作用,例如 doc() 和 collection()正在测试中。