我们有一些需要版本控制的业务需求。为此,我们选择使用 MarkLogic 图书馆服务。我们在使用 XRAY 和使用交易测试我们的代码时遇到问题。
我们的测试如下:
declare function should-save-with-version-when-releasing() {
declare option xdmp:transaction-mode "update";
let $uri := '/some-document-uri.xml'
let $document := fn:doc($uri)
let $pre-release-version := c:get-latest-version($uri)
let $post-release-version := c:get-latest-version($uri)
let $result := mut:release($document) (:this should version up:)
return (assert:not-empty($pre-release-version),
assert:not-empty($result),
assert:not-equal($pre-release-version,$post-release-version),
xdmp:rollback())
无论如何测试都会通过,事实证明 ML 回滚会破坏所有变量。
我们如何使用事务对其进行测试?
非常感谢任何帮助,
我是
最佳答案
使用 MarkLogic,整个 XQuery 更新通常就像单个事务一样。当 mut:release
将更新添加到事务的堆栈时,查询的其余部分将在提交之前看不到该更新。从查询的角度来看,这通常发生在整个查询完成之后,并且对查询不可见。
文档有一些有用的东西可以添加关于 http://docs.marklogic.com/xdmp:rollback 的内容做:
When a transaction is rolled back, the current statement immediately terminates, updates made by any statement in the transaction are discarded, and the transaction terminates.
所以并不是变量被拆除了:而是你的程序结束了。
我认为http://docs.marklogic.com/guide/app-dev/transactions#id_15746有一个非常接近您的用例的示例:“示例:多语句事务和相同语句隔离”。它演示了如何通过 xdmp:eval
或 xdmp:invoke
更新文档并在同一查询中查看结果。
测试它以查看它是否有效,然后将 xdmp:commit
替换为 xdmp:rollback
。对我来说,这个例子仍然有效。开始用您的单元测试逻辑替换其余逻辑,您应该就可以了。
关于测试 XQuery 和 Marklogic 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14018496/