测试 XQuery 和 Marklogic 事务

标签 testing transactions xquery marklogic

我们有一些需要版本控制的业务需求。为此,我们选择使用 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:evalxdmp:invoke 更新文档并在同一查询中查看结果。

测试它以查看它是否有效,然后将 xdmp:commit 替换为 xdmp:rollback。对我来说,这个例子仍然有效。开始用您的单元测试逻辑替换其余逻辑,您应该就可以了。

关于测试 XQuery 和 Marklogic 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14018496/

相关文章:

Laravel Dusk + Vue 与 ElementUI

javascript - 使用 postgreSQL 和 Tape(npm 模块)的 INNER JOIN 查询测试失败

android - 故意让系统关闭并重新启动应用程序

java - Hibernate Session 保存操作是否与底层数据库事务同步?

javax.transaction.Transactional 与 org.springframework.transaction.annotation.Transactional

xml - 将 XML 节点替换为空并添加 xsi :nil through SQL

Android Studio 2.3 在 UI 中没有 Test Instrumentation 说明符

sql-server - 快照事务隔离级别 : it really works as advertised?

java - 使用 XQJ JSR 225 的 Xquery

optimization - XQuery 分组和聚合函数总是很慢吗?