gpt4 book ai didi

sql-server - tSQLt:在 SetUp 和测试之间共享数据

转载 作者:行者123 更新时间:2023-12-04 00:08:02 25 4
gpt4 key购买 nike

我正在使用 tSQLt 对 t-sql 代码进行单元测试。

很多时候,测试的安排部分非常广泛,我试图将其中的大部分内容推送到设置过程中,以便在类内的测试中重用。

如果设置和测试程序可以“知道”相同的信息,即有一些共享数据,那将非常有用。例如,假设安装程序创建一个测试发票并将发票 ID 设置为已知的:

CREATE PROCEDURE [InvoiceManager].[SetUp]
AS
DECLARE @TestId INT = 10;

EXEC tsqlt.FakeTable @SchemaName='dbo', @TableName='Invoice';
INSERT INTO dbo.Invoice (Id, Amount) VALUES (@TestId, 20.50);
GO

然后在测试中我们要对测试发票做一些事情,像这样:

CREATE PROCEDURE [InvoiceManager].[Test_InvoiceHandler]
AS
DECLARE @TestId INT = 10; -- duplication I would like to eliminate

-- Action
EXEC dbo.InvoiceHandler @InvoiceId = @TestId;

-- Assert
-- ... some assertions
GO

如果能够通过将 @TestId 的值插入 SetUp 过程中的某个“类变量”中,然后在测试中使用它来替换在两个(以及更多)过程中重复的 @TestId 值,那就太好了。任何想法如何以紧凑的方式实现它?我可以想象在 [InvoiceManager] 模式中创建一个表并在测试中读取它。任何可能存在这样的事情只是我在文档中找不到它?谢谢!

最佳答案

一种方法是改变您的设置方式。您可以在测试模式上创建一个新过程,而不是在 SetUp 过程中定义“排列”数据。例如,InvoiceManager.Arrange。此过程可以将您的 @TestId 作为输入参数。然后,您将从每个测试过程中调用 InvoiceManager.Arrange。我经常使用这种技术而不是使用 SetUp 并发现它工作得很好。尽管我需要从每个测试过程中显式调用它,但我发现如果它很复杂,我可以将我的 Arrange 步骤分解为多个命名良好的存储过程。

这里有一个例子来说明我将如何解决你的问题:

CREATE PROCEDURE [InvoiceManager].[Arrange]
@TestId INT
AS
EXEC tsqlt.FakeTable @SchemaName='dbo', @TableName='Invoice';
INSERT INTO dbo.Invoice (Id, Amount) VALUES (@TestId, 20.50);
GO

CREATE PROCEDURE [InvoiceManager].[Test_InvoiceHandler]
AS
DECLARE @TestId INT = 10;
EXEC InvoiceManager.Arrange @TestId;

-- Action
EXEC dbo.InvoiceHandler @InvoiceId = @TestId;

-- Assert
-- ... some assertions
GO

关于sql-server - tSQLt:在 SetUp 和测试之间共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29231212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com