0

前几天我注意到您可以编写一个测试,其中实际表中的列比预期表中的列更多,并且如果数据在两者中都存在的列中匹配,则测试仍将通过。

这是一个例子:

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

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

4

1 回答 1

1

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

您当然可以在同一个测试中同时运行这两个测试,并且只有当两个检查都通过时,测试才会通过。

我想拆分的原因可能是因为在极少数情况下,您关心数据或元数据是否与您的测试一致,但不是两者都关心。

于 2013-07-18T17:10:30.980 回答