【问题标题】:tSQLt apply NOT NULL constrainttSQLt 应用 NOT NULL 约束
【发布时间】:2019-03-19 19:31:28
【问题描述】:

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

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

【问题讨论】:

  • 回到一列是什么意思?
  • 我刚刚添加了一些示例代码。这是否可以清除它(列=字段/单元格)?
  • @RuudHermans 。 . .您的问题的答案可能是:“是的,您可以在表中添加和删除约束”。
  • 我应该重新编辑它以包括它应该如何完成吗?我知道如何添加一个约束,但我找不到任何关于在伪造的表上添加特别非空约束的信息。

标签: sql sql-server tsqlt


【解决方案1】:

OP 专门询问如何在 tSQLt 单元测试的上下文中执行此操作。

对于那些不知道的人,tSQLt.FakeTable 会暂时用一个模拟表替换一个真实表,该模拟表具有相同的架构、表和列名以及所有相同的数据类型,但没有任何约束。因此,所有列都允许为 NULL,并且在测试期间删除所有键、默认值、检查约束甚至 IDENTITY 属性。在针对具有许多依赖项的单个表编写单元测试时,这可能很有用 - 它最大限度地减少了每个测试所需的设置。在每次测试结束时,运行该测试的事务都会回滚并返回原始表结构。

现在回到实际问题,虽然 tSQLt.Fake 表确实允许在模拟中保留原始表的某些特性,包括自动增量、计算列和默认约束,但可空性不是这些特性之一。尽管如果@SebastianMeine 或@dennislloydjr 正在阅读本文,那么这样的功能可能是一个有用的增值。

我不相信没有自动方法将 NOT NULL 应用于伪造表中的列,但是它确实会引发有关您的用例的问题。虽然 FakeTable 在许多测试场景中非常有用,但在某些情况下,您可能希望针对真实表运行一个或多个测试。这里最明显的例子是一个存储过程,旨在向该表插入一个新行。如果在写入插入存储过程后将新的 NOT NULL 列添加到表中,则该过程将失败,因为它没有将值插入到新的强制列中。您肯定希望在测试中选择它,并针对真实表对该存储过程进行至少一次测试,以便在您投入生产之前检测到该错误。

如果您的用例要求仅将特定列设置回 NOT NULL,那么您可以在调用 tSQLt.FakeTable 后手动执行 UPDATE myTable ALTER COLUMN myColumn <datatype> NOT NULL,尽管这种方法的危险在于该列的数据类型或可空性将来发生更改时,您将无法自动更改测试中的列定义 - 这会降低测试的可靠性。

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

【讨论】:

    【解决方案2】:

    尝试以下方法:

    UPDATE MYTABLE
    SET MyColumn = 'Default Value'
    WHERE MyColumn IS NULL
    
    ALTER TABLE MYTABLE
    AlTER COLUMN MyColumn DATATYPE NOT NULL
    

    【讨论】:

      【解决方案3】:

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

      您可以创建一个重载原始 FakeTable 的私有版本。这样您就可以自动恢复 NULLability 设置。 (我们有一个相当广泛的扩展模式,它重载了 FakeTable 并实现了许多其他内部功能,而不会改变基本产品。)现在,当你填充测试数据时,你必须考虑所有 NOT NULL 列,这就是 FakeTable部分目的是为了避免。将所有列设为 NULLable 可以让您将测试重点放在对该测试上下文重要的列上。

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

      【讨论】:

        猜你喜欢
        • 2015-04-22
        • 2018-08-24
        • 2022-01-19
        • 2021-11-16
        • 2020-12-18
        • 2021-03-20
        • 2020-02-11
        • 2019-02-13
        • 2017-12-31
        相关资源
        最近更新 更多