Sql server 在.NET Core和SQL Server中对存储过程和函数进行单元测试
问题:如何对存储过程和函数进行单元测试 我看到过关于它的不同帖子,但仍然不知道什么是正确的方法 我尝试的内容:我在VisualStudio中创建了一个项目来上载数据库模式(包含我的存储过程和相关函数)。从那里我创建了另一个带有单元测试的项目。但不幸的是,我发现它微不足道,而且有点无用 我的存储过程没什么大不了的,但我仍然想知道是否有一种方法可以正确地对其进行单元测试 存储过程:Sql server 在.NET Core和SQL Server中对存储过程和函数进行单元测试,sql-server,function,unit-testing,stored-procedures,Sql Server,Function,Unit Testing,Stored Procedures,问题:如何对存储过程和函数进行单元测试 我看到过关于它的不同帖子,但仍然不知道什么是正确的方法 我尝试的内容:我在VisualStudio中创建了一个项目来上载数据库模式(包含我的存储过程和相关函数)。从那里我创建了另一个带有单元测试的项目。但不幸的是,我发现它微不足道,而且有点无用 我的存储过程没什么大不了的,但我仍然想知道是否有一种方法可以正确地对其进行单元测试 存储过程: CREATE PROCEDURE update_player @Username NVARCHAR (2
CREATE PROCEDURE update_player
@Username NVARCHAR (250),
@Luck INT,
@DiceNumber INT
AS
UPDATE [dbo].[Player]
SET [Coins] = dbo.CalculatePlayerCoins(@Luck, @DiceNumber)
WHERE [Username] = @Username
GO
我的职能:
CREATE FUNCTION CalculatePlayerCoins
(@Luck INT, @DiceNumber INT)
RETURNS INT
AS
BEGIN
DECLARE @ret INT;
SELECT
@ret = @Luck * @DiceNumber * (SELECT Value FROM getRandomValue)
IF (@ret IS NULL)
SET @ret = 0;
RETURN @ret;
END;
getRandomValue
是一个返回随机值的视图
如果可能的话,我想使用xUnit来测试这个。否则,如果你能给我指出正确的方向,那就太棒了。提前谢谢 视图通常基于表,这些表可以为单元测试添加已知值。在这种情况下,您需要将返回随机值的视图(可能使用
RAND()
或类似方法)临时替换为返回已知测试值的存根
下面是使用的示例。tSQLt.Run
framework过程在事务中执行单元测试,测试后回滚。尽管这样的单元测试可以针对共享开发数据库执行,但我建议在隔离的数据库上运行单元测试,以避免影响其他开发人员
CREATE PROC dbo.test_dbo_update_player
AS
--create a stub view that returns known values for unit testing
EXEC sp_rename N'dbo.getRandomValue', 'getRandomValue_orig';
EXEC('CREATE VIEW dbo.getRandomValue AS SELECT 1 AS value;');
--create a fake table with known data for this test case
EXEC tSQLt.FakeTable 'dbo.Player';
INSERT INTO dbo.Player (UserName,Coins) Values(N'Test', 0);
EXEC dbo.update_player
@Username = N'Test'
, @Luck = 2
, @DiceNumber = 3;
DECLARE @actual int =(SELECT Coins FROM dbo.Player WHERE UserName = N'Test');
EXEC tSQLt.AssertEquals @expected = 6, @actual = @actual, @message = 'assert equal failed for test case';
GO
--unit test framework executes unit test in a transaction and will rollback after completion
EXEC tSQLt.Run @testName = 'dbo.test_dbo_update_player';
GO
如果你想在T-SQL中编写你的单元测试,你可以考虑。@ DanGuzman,我能举个例子来想出一个主意吗?