tSqlt - 使用模式集合输出XML的单元测试过程
问题描述:
我们目前正在为需要XML负载的集成项目开发SQL存储过程,这是我们使用模式集合实现的,以确保严格遵守定义的模式。tSqlt - 使用模式集合输出XML的单元测试过程
我们希望为这些存储过程编写单元测试,但给出的输出是XML,我不知道如何(或者如果)我可以用tsqlt中的断言存储过程来做到这一点(而不必将所有内容都转换为表格/表变量)
可有人请点我在正确的方向 - 它是否可以/不可以做的,如果它不可能的,我应该怎么办法试图创建XML有效载荷的新资产的存储过程?
或者,我们是否可以通过在每次测试中将XML的预期结果和实际结果转换为表格来节省大量时间/心痛?
感谢
答
如果你正在处理该节点的顺序可能会改变这种状况,那么XML转换为表可能是你最好的选择。
如果节点和属性的顺序在输出中是固定的,那么可以将XML转换为NVARCHAR(MAX)
,然后使用tSQLt.AssertEqualsString
。
答
如果存储过程的输出是一个非类型化XML(XML没有XML架构集合),那么我们可以检查是否是XML坚持XML架构集合因而试图通过转换为键入XML(XML(XMLSchemaCollectionName)
),因此(两个例子) :
CREATE XML SCHEMA COLLECTION mySC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="root" type="string"/>
</schema> ';
GO
DECLARE @x XML = N'<root>innerText1</root>'
DECLARE @y XML
SET @y = CONVERT(XML(mySC) , @x)
输出:
Command(s) completed successfully.
或
DECLARE @x XML = N'<R>innerText1</R>'
DECLARE @y XML
SET @y = CONVERT(XML(mySC) , @x)
输出
Msg 6913, Level 16, State 1, Line 8
XML Validation: Declaration not found for element 'R'. Location: /*:R[1]
所以,用于试验的情况下部分源代码将是:
DECLARE @XmlResults XML
DECLARE @XmlWithSchemaColl XML
EXEC dbo.CallIntegrationProjStoreProc ...., @XmlResults OUTPUT -- The output is (in this example) just an untyped XML scalar variable
BEGIN TRY
SET @XmlWithSchemaColl = CONVERT(XML(mySC) , @XmlResults)
END TRY
BEGIN CATCH
tSQLt.AssertEquals @expected = 1, @actual = 0, @message = 'Invalid XML schema collection ...'
END CATCH