可能有多个数据库连接
Possible with multiple database connections
tSQLt 世界的新手(很棒的工具集)并且遇到了我正在为其设置测试的存储过程的小问题。
如果我出于某种原因有一个连接到多个数据库甚至多个 SQL 服务器(链接服务器)的存储过程。
在这种情况下可以用tSQLt做单元测试吗?
我已经评论过了,但我想补充一些。因此,正如我已经说过的,您可以做任何适合单笔交易的事情。
但对于你的情况,我建议为每个交叉 database/instance 对象创建同义词,然后在所有地方使用同义词。
我创建了以下函数来模拟 view/tables 同义词。它有一些限制,但至少它可以处理简单的用例。
CREATE PROCEDURE [tSQLt].[FakeSynonymTable] @SynonymTable VARCHAR(MAX)
AS
BEGIN
DECLARE @NewName VARCHAR(MAX)= @SynonymTable+REPLACE(CAST(NEWID() AS VARCHAR(100)), '-', '');
DECLARE @RenameCmd VARCHAR(MAX)= 'EXEC sp_rename '''+@SynonymTable+''', '''+@NewName+''';';
EXEC tSQLt.SuppressOutput
@RenameCmd;
DECLARE @sql VARCHAR(MAX)= 'SELECT * INTO '+@SynonymTable+' FROM '+@NewName+' WHERE 1=2;';
EXEC (@sql);
EXEC tSQLt.FakeTable
@TableName = @SynonymTable;
END;
如果您不提供示例代码,我不确定您的确切用例,但此信息可能会有所帮助。
跨数据库测试的另一种方法(假设两个数据库都在同一个实例上)是在两个数据库中安装 tSQLt。然后你可以像模拟本地对象一样模拟远程数据库中的对象。
例如如果您在 LocalDb 中有一个存储过程引用了 RemoteDb 中的 table,您可以这样做:
假设您有一个过程,它从本地数据库中名为 localTable 的 table 中选择一行并将该行插入到远程数据库中名为 remoteTable 的 table 中(在同一实例上)
create procedure [myTests].[test mySproc inserts remoteTable from local table]
as
begin
-- Mock the local table in the local database
exec tSQLt.FakeTable 'dbo.localTable' ;
-- Mock the remote table (not the three part object reference to remoteDb)
exec RemoteDb.tSQLt.FakeTable 'dbo.remoteTable' ;
--! Data setup ommitted
--! exec dbo.mySproc @param = 'some value' ;
--! Get the data from the remote table into a temp table so we can test it
select * into #expected from RemoteDb.dbo.remoteTable;
--! Assume we have already populated #actual with our expected results
exec tSQLt.AssertEqualsTable '#expected', '#actual' ;
end
上面的代码演示了基础知识,但几年前我在博客上对此进行了更详细的介绍 here。
遗憾的是,这种方法不适用于链接服务器,
tSQLt 世界的新手(很棒的工具集)并且遇到了我正在为其设置测试的存储过程的小问题。
如果我出于某种原因有一个连接到多个数据库甚至多个 SQL 服务器(链接服务器)的存储过程。
在这种情况下可以用tSQLt做单元测试吗?
我已经评论过了,但我想补充一些。因此,正如我已经说过的,您可以做任何适合单笔交易的事情。
但对于你的情况,我建议为每个交叉 database/instance 对象创建同义词,然后在所有地方使用同义词。
我创建了以下函数来模拟 view/tables 同义词。它有一些限制,但至少它可以处理简单的用例。
CREATE PROCEDURE [tSQLt].[FakeSynonymTable] @SynonymTable VARCHAR(MAX)
AS
BEGIN
DECLARE @NewName VARCHAR(MAX)= @SynonymTable+REPLACE(CAST(NEWID() AS VARCHAR(100)), '-', '');
DECLARE @RenameCmd VARCHAR(MAX)= 'EXEC sp_rename '''+@SynonymTable+''', '''+@NewName+''';';
EXEC tSQLt.SuppressOutput
@RenameCmd;
DECLARE @sql VARCHAR(MAX)= 'SELECT * INTO '+@SynonymTable+' FROM '+@NewName+' WHERE 1=2;';
EXEC (@sql);
EXEC tSQLt.FakeTable
@TableName = @SynonymTable;
END;
如果您不提供示例代码,我不确定您的确切用例,但此信息可能会有所帮助。
跨数据库测试的另一种方法(假设两个数据库都在同一个实例上)是在两个数据库中安装 tSQLt。然后你可以像模拟本地对象一样模拟远程数据库中的对象。
例如如果您在 LocalDb 中有一个存储过程引用了 RemoteDb 中的 table,您可以这样做:
假设您有一个过程,它从本地数据库中名为 localTable 的 table 中选择一行并将该行插入到远程数据库中名为 remoteTable 的 table 中(在同一实例上)
create procedure [myTests].[test mySproc inserts remoteTable from local table]
as
begin
-- Mock the local table in the local database
exec tSQLt.FakeTable 'dbo.localTable' ;
-- Mock the remote table (not the three part object reference to remoteDb)
exec RemoteDb.tSQLt.FakeTable 'dbo.remoteTable' ;
--! Data setup ommitted
--! exec dbo.mySproc @param = 'some value' ;
--! Get the data from the remote table into a temp table so we can test it
select * into #expected from RemoteDb.dbo.remoteTable;
--! Assume we have already populated #actual with our expected results
exec tSQLt.AssertEqualsTable '#expected', '#actual' ;
end
上面的代码演示了基础知识,但几年前我在博客上对此进行了更详细的介绍 here。
遗憾的是,这种方法不适用于链接服务器,