前几天我注意到你可以编写一个测试,其中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表具有更多列时才会发生这种情况。如果预期有更多列,则会生成错误。它是否正确?有谁知道这种行为背后的原因是什么?
答案 0 :(得分:1)
虽然在这方面没有特别好的文档记录,但AssertEqualsTable例程只查看表中的数据 - 而不是列是相同的。要检查表结构是否相同,请使用AssertResultSetsHaveSameMetaData。我写了一些关于in this article的内容。
你当然可以在同一个测试中运行,只有两个检查都通过才能通过测试。
我想分离的原因是因为可能会出现罕见的情况,您关心数据或元数据是否与测试一致,但两者都不一致。