Sql server 在.NET Core和SQL Server中对存储过程和函数进行单元测试

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

问题:如何对存储过程和函数进行单元测试

我看到过关于它的不同帖子,但仍然不知道什么是正确的方法

我尝试的内容:我在VisualStudio中创建了一个项目来上载数据库模式(包含我的存储过程和相关函数)。从那里我创建了另一个带有单元测试的项目。但不幸的是,我发现它微不足道,而且有点无用

我的存储过程没什么大不了的,但我仍然想知道是否有一种方法可以正确地对其进行单元测试

存储过程:

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,我能举个例子来想出一个主意吗?