将 xqsuite 用于 exist-db 中的库模块

using xqsuite for library modules in exist-db

我喜欢编写调用xq文件即可执行的库模块。但是,这些也包含我想测试的功能。像这样 some.xql:

xquery version "3.0";
 import module namespace xmldb="http://exist-db.org/xquery/xmldb";
 declare namespace no="http://none";
 declare namespace test="http://exist-db.org/xquery/xqsuite";

 declare 
    %test:arg('1')
    %test:assertEquals('2')
    function no:something ($num as xs:string?) as xs:string {
     return 
          $num + 1
};

 xmldb:store('/db/data/', 'two.xml',<root>{no:something(1)}</root>)

但是我无法测试整个模块或其中的 no:something 函数。我在其他上下文中使用以下函数访问该函数没有问题:

import module namespace no="http://none" at "some.xql";

然而,当尝试从包装函数 运行 测试套件时,我不断收到 xpty00004 错误:

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("some.xql"))
)

我尝试了不同的方法来访问 no:some 函数,但没有锁定。我只是写了非常糟糕的查询,错误地使用了 xqsuite,还是这是一个错误?

您的 some.xql 是一个 主模块 ,您只能在 库模块 .[=17 中导入和测试函数=]

考虑重构为库模块,例如 no.xqm:

xquery version "3.0";

module namespace no="http://none";

declare namespace test="http://exist-db.org/xquery/xqsuite";

declare 
  %test:arg('1')
  %test:assertEquals('2')
function no:something ($num as xs:string?) as xs:string {
  $num + 1
};

您的应用主模块some.xq

xquery version "3.0";

import module namespace no="http://none" at "no.xqm";

xmldb:store('/db/data/', 'two.xml',<root>{no:something(1)}</root>

你的测试运行器主模块tests.xq:

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("no.xqm"))
)