首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tSQLt应用非空约束

tSQLt应用非空约束
EN

Stack Overflow用户
提问于 2019-03-20 03:31:29
回答 3查看 356关注 0票数 0

如何在tSQLt中将NOT NULL约束应用回表的列?

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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操作,尽管这种方法的危险在于,如果该列的数据类型或可空性将来发生变化,您将无法在测试中自动更改列定义-这会导致测试的可靠性降低。

很抱歉,你的问题没有简单的答案。

票数 2
EN

Stack Overflow用户

发布于 2019-03-20 03:53:00

尝试以下操作:

代码语言:javascript
复制
UPDATE MYTABLE
SET MyColumn = 'Default Value'
WHERE MyColumn IS NULL

ALTER TABLE MYTABLE
AlTER COLUMN MyColumn DATATYPE NOT NULL
票数 1
EN

Stack Overflow用户

发布于 2021-04-08 23:33:50

在tSQLt测试中丢失NULLability应该不是问题。您可以控制放置在伪造表格中的数据。您可以确保填充了需要进行正确测试的值的列。通过在测试执行期间更改列来改变伪表的特征,使得测试的长期维护变得更加困难。

您可以创建一个私有版本的FakeTable来重载原始版本。这样,您就可以自动恢复NULLability设置。(我们有一个非常广泛的扩展模式,可以重载FakeTable并实现许多其他内部功能,而无需更改基础产品。)这样做的缺点是,当您填充测试数据时,您现在必须考虑到所有非空列,这是FakeTable打算部分避免的。将所有列设置为NULLable允许您将测试重点放在与该测试上下文相关的列上。

您没有说明为什么要恢复NULLability设置。知道这一点将会改善任何答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55248735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档