1

我正在使用 marklogic-unit-test 设置单元测试,我想做的一件事是检查给定文档是否具有特定权限。但是,当我针对权限序列测试我的权限时,我收到一个XDMP-NONMIXEDCOMPLEXCONT错误。我认为这与权限是复杂对象而不是简单字符串这一事实有关,因为这适用于集合。

const test = require("/test/test-helper.xqy");
let p1 = Sequence.from([xdmp.permission("rest-reader", "read", "element")]);
let p2 = Sequence.from([
  xdmp.permission("rest-reader", "read", "element"), 
  xdmp.permission("rest-writer", "update", "element")
]);
test.assertAtLeastOneEqual(p1, p2)

返回:

[javascript] XDMP-NONMIXEDCOMPLEXCONT: fn:data(<sec:permission 
xmlns:sec="http://marklogic.com/xdmp/security">
<sec:capability>...</sec:capability>...</sec:permission>) 
-- Node has complex type with non-mixed complex content

我能想到的最好的选择是显式循环序列并对fn.deepEqual每个元素进行比较。有没有更好的办法?

4

1 回答 1

2

test.assertAtLeastOneEqual()函数需要原子值(item()签名)。唯一可以处理元素的测试辅助函数是test.assertEqualXml(),但它会查找完全匹配。我认为您最好的选择是对权限进行字符串化。像这样的东西:

const test = require("/test/test-helper.xqy");
let p1 = [xdmp.permission("rest-reader", "read")];
let p2 = [
  xdmp.permission("rest-reader", "read"), 
  xdmp.permission("rest-writer", "update")
];
p1 = Sequence.from(p1.map(p => xdmp.roleName(p.roleId) + ':' + p.capability));
p2 = Sequence.from(p2.map(p => xdmp.roleName(p.roleId) + ':' + p.capability));
test.assertAtLeastOneEqual(p1, p2)
于 2020-11-10T07:47:38.447 回答