tSQLt AssertEqualsTable - 表模式不匹配时的意外结果

时间:2013-07-18 06:40:30

标签: tsqlt

前几天我注意到你可以编写一个测试,其中Actual表中有更多列在Expected表中,如果数据在两者中存在的列中匹配,测试仍将通过。

以下是一个例子:

if exists(select * from INFORMATION_SCHEMA.ROUTINES where ROUTINE_SCHEMA='UnitTests_FirstTry' and ROUTINE_NAME='test_AssertEqualsTable_IgnoresExtraColumnsInActual')
begin
    drop procedure  UnitTests_FirstTry.test_AssertEqualsTable_IgnoresExtraColumnsInActual
end
go

create procedure UnitTests_FirstTry.test_AssertEqualsTable_IgnoresExtraColumnsInActual
as
begin

    IF OBJECT_ID(N'tempdb..#Expected') > 0 DROP TABLE [#Expected];
    IF OBJECT_ID(N'tempdb..#Actual') > 0 DROP TABLE [#Actual];

create table #expected( a int null) --, b int null, c varchar(10) null)
create table #actual(a int, x money null)
insert #expected (a) values (1)
insert #actual (a, x) values (1, 22.51)
--insert #expected (a, b, c) values (1,2,'test')
--insert #actual (a, x) values (1, 22.51)

exec tSQLt.AssertEqualsTable '#expected', '#actual'

end
go

exec tSQLt.Run 'UnitTests_FirstTry.test_AssertEqualsTable_IgnoresExtraColumnsInActual'
go

当我从不再需要那些列的测试的Expected表中删除了一些额外的列时,我注意到了这一点,但我忘了从Actual表中删除相同的列并且我的测试仍然通过,这对我来说有点放弃。 仅当Actual表具有更多列时才会发生这种情况。如果预期有更多列,则会生成错误。它是否正确?有谁知道这种行为背后的原因是什么?

1 个答案:

答案 0 :(得分:1)

虽然在这方面没有特别好的文档记录,但AssertEqualsTable例程只查看表中的数据 - 而不是列是相同的。要检查表结构是否相同,请使用AssertResultSetsHaveSameMetaData。我写了一些关于in this article的内容。

你当然可以在同一个测试中运行,只有两个检查都通过才能通过测试。

我想分离的原因是因为可能会出现罕见的情况,您关心数据或元数据是否与测试一致,但两者都不一致。