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