Yur*_*ouk 2 sql-server tdd unit-testing tsqlt
我正在使用tSQLt对t-sql代码进行单元测试。
通常,测试的“安排”部分相当广泛,我试图将其中的大部分推到SetUp过程中,以便在类中的测试之间重用。
如果安装程序和测试过程可以“知道”相同的信息,即拥有一些共享数据,那将非常有用。例如,假设安装程序创建了测试发票并将发票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
Run Code Online (Sandbox Code Playgroud)
然后在测试中,我们想对测试发票进行处理,例如:
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
Run Code Online (Sandbox Code Playgroud)
能够通过在SetUp过程中将@TestId的值推入某个“类变量”,然后在测试中使用它,来替换在两个(或更多过程)中复制@TestId的值将是一个很好的选择。有什么想法如何以紧凑的方式实现它吗?我可以想象在[InvoiceManager]模式中创建表并在测试中从中读取数据。是否有这样的机会存在,只是我在文档中找不到它?谢谢!
一种方法是更改设置方式。您可以在测试架构上创建一个新过程,而不是在SetUp过程中定义“安排”数据。例如,InvoiceManager.Arrange。此过程可以将您的@TestId作为输入参数。然后,您将在每个测试过程中调用InvoiceManager.Arrange。我经常使用这种技术,而不是使用SetUp,并且发现它工作得很好。即使我需要从每个测试过程中显式调用它,但我发现我可以将“整理”步骤分解为多个复杂的命名过程。
这是一个示例,说明我如何解决您的问题:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1049 次 |
| 最近记录: |