如何在tSQLt中将NOT NULL约束应用回表的列?
CREATE OR ALTER PROCEDURE [test abc].[test abc1]
AS
BEGIN
-- Arrange
EXEC tSQLt.FakeTable 'dbo', 'table1';
-- Here the NOT NULL constraint should be put back on table1 column col1
EXEC [tSQLt].[ExpectNoException]
-- Act + Assert
INSERT INTO .....
END
GO发布于 2019-03-20 16:15:35
OP特别询问如何在tSQLt单元测试的上下文中做到这一点。
对于那些不知道的人来说,tSQLt.FakeTable暂时用一个模拟替换了一个真实的表,这个模拟具有相同的模式、表和列名,以及所有相同的数据类型,但没有任何约束。因此,所有列都允许为NULL,并且在测试期间将删除所有键、默认值、检查约束甚至标识属性。当针对具有许多依赖项的单个表编写单元测试时,这会很有用--它最大限度地减少了每次测试所需的设置。在每次测试结束时,将回滚在其中运行该测试的事务,并返回原始表结构。
现在来看实际问题,虽然tSQLt.Fake表允许在模拟中保留原始表的某些特性,包括自动增量、计算列和缺省约束,但空性不是这些特性之一。虽然如果@SebastianMeine或@dennislloydjr正在阅读这篇文章,但这样的功能可能是一个有用的增值功能。
我认为没有一种自动的方法可以将NOT NULL应用于伪造表中的列,但是它确实提出了一个关于用例的问题。虽然FakeTable在许多测试场景中都非常有用,但在某些情况下,您可能希望对真实的表运行一项或多项测试。这里最明显的示例是一个存储过程,该存储过程旨在向该表中插入新行。如果在写入insert存储过程之后向表中添加了新的NOT NULL列,则该过程将失败,因为它没有将值插入到新的强制列中。您肯定希望在测试中获得它,并对实际表进行至少一次该存储过程的测试,以便在投入生产之前检测到该bug。
如果您的用例要求仅将特定列设置回NOT NULL,那么您可以在调用tSQLt.FakeTable之后手动执行UPDATE myTable ALTER COLUMN myColumn <datatype> NOT NULL操作,尽管这种方法的危险在于,如果该列的数据类型或可空性将来发生变化,您将无法在测试中自动更改列定义-这会导致测试的可靠性降低。
很抱歉,你的问题没有简单的答案。
发布于 2019-03-20 03:53:00
尝试以下操作:
UPDATE MYTABLE
SET MyColumn = 'Default Value'
WHERE MyColumn IS NULL
ALTER TABLE MYTABLE
AlTER COLUMN MyColumn DATATYPE NOT NULL发布于 2021-04-08 23:33:50
在tSQLt测试中丢失NULLability应该不是问题。您可以控制放置在伪造表格中的数据。您可以确保填充了需要进行正确测试的值的列。通过在测试执行期间更改列来改变伪表的特征,使得测试的长期维护变得更加困难。
您可以创建一个私有版本的FakeTable来重载原始版本。这样,您就可以自动恢复NULLability设置。(我们有一个非常广泛的扩展模式,可以重载FakeTable并实现许多其他内部功能,而无需更改基础产品。)这样做的缺点是,当您填充测试数据时,您现在必须考虑到所有非空列,这是FakeTable打算部分避免的。将所有列设置为NULLable允许您将测试重点放在与该测试上下文相关的列上。
您没有说明为什么要恢复NULLability设置。知道这一点将会改善任何答案。
https://stackoverflow.com/questions/55248735
复制相似问题