在 Xspec 中使用 <x:expect test = ""/>
Using <x:expect test = ""/> in Xspec
请帮助我了解 xspec 语法。
我想将测试文件中的值与常量进行比较:
测试文件:
<?xml version='1.0' encoding='ISO-8859-5'?>
<List>
<M_INSDES>
<S_UNH>
<D_0062>3600</D_0062>
<C_S009>
<D_0065>INSDES</D_0065>
<D_0052>D</D_0052>
<D_0054>96A</D_0054>
<D_0051>UN</D_0051>
<D_0057>EAN001</D_0057>
</C_S009>
</S_UNH>
</M_INSDES>
</List>
以下场景按预期工作:
<x:scenario label="Scenario for testing an EDIFACT document type">
<x:context href="test.xml" select="/List/M_INSDES/S_UNH/C_S009/D_0065">
</x:context>
<x:expect label="The result of testing EDIFACT document type">INSDES</x:expect>
</x:scenario>
但是乘法值的场景失败了:
<x:scenario label="Scenario for testing an EDIFACT document type for inbound file">
<x:context href="test.xml" select="/List/M_INSDES/S_UNH/C_S009">
</x:context>
<x:expect label="Message type identifier" test="D_0065 = 'INSDES'"></x:expect>
<x:expect label="Message type version number" test="D_0052 = 'D'"></x:expect>
<x:expect label="Message type release number" test="D_0054 = '96A'"></x:expect>
</x:scenario>
如何使用 <x:expect test = ""/>
检查节点 C_S009 的三个值?
更新:添加了 xsl 样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="myfunctions"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
我认为你做的一切都是正确的,但是你的相对 xpaths 的上下文是错误的。尝试在 expect
元素中使用 绝对路径 并 选择根元素 :
<x:scenario label="Scenario for testing an EDIFACT document type for inbound file">
<x:context href="testdata.xml" select="/">
</x:context>
<x:expect label="Message type identifier" test="/List/M_INSDES/S_UNH/C_S009/D_0065 = 'INSDES'"></x:expect>
<x:expect label="Message type version number" test="/List/M_INSDES/S_UNH/C_S009/D_0052 = 'D'"></x:expect>
<x:expect label="Message type release number" test="/List/M_INSDES/S_UNH/C_S009/D_0054 = '96A'"></x:expect>
</x:scenario>
我认为相对路径不起作用,因为您的样式表在匹配根元素时只是复制了整个文档。在包含错误的 XSpec 报告中,您可以看到使用相对路径的测试结果只是元素的字符串值。
在您发布样式表之前,我使用了带有递归 "copy-all-nodes" 模板的样式表。
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
使用此样式表,相对路径可以正常工作。
<x:scenario label="Scenario for testing an EDIFACT document type for inbound file">
<x:context href="testdata.xml" select="/List/M_INSDES/S_UNH/C_S009">
</x:context>
<x:expect label="Message type identifier" test="C_S009/D_0065 = 'INSDES'"></x:expect>
<x:expect label="Message type version number" test="C_S009/D_0052 = 'D'"></x:expect>
<x:expect label="Message type release number" test="C_S009/D_0054 = '96A'"></x:expect>
</x:scenario>
您可以 post 您正在使用 XSpec 测试的 XSLT 代码吗?没有 XSLT 很难重现它。
如果您正在测试原子值(即您的情况下的字符串),您可能有兴趣使用 x:expect
元素的 select
属性,如 XSpec documentation 中所述。
请帮助我了解 xspec 语法。 我想将测试文件中的值与常量进行比较: 测试文件:
<?xml version='1.0' encoding='ISO-8859-5'?>
<List>
<M_INSDES>
<S_UNH>
<D_0062>3600</D_0062>
<C_S009>
<D_0065>INSDES</D_0065>
<D_0052>D</D_0052>
<D_0054>96A</D_0054>
<D_0051>UN</D_0051>
<D_0057>EAN001</D_0057>
</C_S009>
</S_UNH>
</M_INSDES>
</List>
以下场景按预期工作:
<x:scenario label="Scenario for testing an EDIFACT document type">
<x:context href="test.xml" select="/List/M_INSDES/S_UNH/C_S009/D_0065">
</x:context>
<x:expect label="The result of testing EDIFACT document type">INSDES</x:expect>
</x:scenario>
但是乘法值的场景失败了:
<x:scenario label="Scenario for testing an EDIFACT document type for inbound file">
<x:context href="test.xml" select="/List/M_INSDES/S_UNH/C_S009">
</x:context>
<x:expect label="Message type identifier" test="D_0065 = 'INSDES'"></x:expect>
<x:expect label="Message type version number" test="D_0052 = 'D'"></x:expect>
<x:expect label="Message type release number" test="D_0054 = '96A'"></x:expect>
</x:scenario>
如何使用 <x:expect test = ""/>
检查节点 C_S009 的三个值?
更新:添加了 xsl 样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="myfunctions"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
我认为你做的一切都是正确的,但是你的相对 xpaths 的上下文是错误的。尝试在 expect
元素中使用 绝对路径 并 选择根元素 :
<x:scenario label="Scenario for testing an EDIFACT document type for inbound file">
<x:context href="testdata.xml" select="/">
</x:context>
<x:expect label="Message type identifier" test="/List/M_INSDES/S_UNH/C_S009/D_0065 = 'INSDES'"></x:expect>
<x:expect label="Message type version number" test="/List/M_INSDES/S_UNH/C_S009/D_0052 = 'D'"></x:expect>
<x:expect label="Message type release number" test="/List/M_INSDES/S_UNH/C_S009/D_0054 = '96A'"></x:expect>
</x:scenario>
我认为相对路径不起作用,因为您的样式表在匹配根元素时只是复制了整个文档。在包含错误的 XSpec 报告中,您可以看到使用相对路径的测试结果只是元素的字符串值。
在您发布样式表之前,我使用了带有递归 "copy-all-nodes" 模板的样式表。
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
使用此样式表,相对路径可以正常工作。
<x:scenario label="Scenario for testing an EDIFACT document type for inbound file">
<x:context href="testdata.xml" select="/List/M_INSDES/S_UNH/C_S009">
</x:context>
<x:expect label="Message type identifier" test="C_S009/D_0065 = 'INSDES'"></x:expect>
<x:expect label="Message type version number" test="C_S009/D_0052 = 'D'"></x:expect>
<x:expect label="Message type release number" test="C_S009/D_0054 = '96A'"></x:expect>
</x:scenario>
您可以 post 您正在使用 XSpec 测试的 XSLT 代码吗?没有 XSLT 很难重现它。
如果您正在测试原子值(即您的情况下的字符串),您可能有兴趣使用 x:expect
元素的 select
属性,如 XSpec documentation 中所述。