【问题标题】:Possible with multiple database connections可能有多个数据库连接
【发布时间】:2017-12-08 05:13:55
【问题描述】:

tSQLt 世界的新手(很棒的工具集),遇到了一个我正在为其设置测试的存储过程的小问题。

如果我出于某种原因有一个连接到多个数据库甚至多个 SQL 服务器(链接服务器)的存储过程。

在这种情况下是否可以使用 tSQLt 进行单元测试?

【问题讨论】:

  • 你可以做任何适合单个事务的事情

标签: stored-procedures linked-server tsqlt


【解决方案1】:

我已经发表了评论,但我想补充一些。所以正如我已经说过的,你可以做任何适合单笔交易的事情。

但对于您的情况,我建议为每个跨数据库/实例对象创建同义词,然后在任何地方使用同义词。

我创建了以下函数来模拟视图/表格同义词。它有一些限制,但至少它可以处理简单的用例。

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; 

【讨论】:

  • 太好了,谢谢我还有一些与分布式事务有关的额外问题,但我认为它们超出了范围
【解决方案2】:

如果您不提供示例代码,我无法确定您的确切用例,但此信息可能会有所帮助。

跨数据库测试的替代方法(假设两个数据库在同一个实例上)是在两个数据库中安装 tSQLt。然后,您可以像在本地一样模拟远程数据库中的对象。

例如如果您在 LocalDb 中有一个引用 RemoteDb 中的表的存储过程,您可以执行以下操作:

假设您有一个过程,它从本地数据库中名为 localTable 的表中选择一行并将该行插入到远程数据库中名为 remoteTable 的表中(在同一实例上)

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

不幸的是,这种方法不适用于链接服务器,

【讨论】:

  • 谢谢,是的,对不起,我已经配置了这个博客中概述的测试项目:kzhendev.wordpress.com/2014/01/08/… 基本上你有两个数据库项目,一个用于实际实现,一个额外的项目用于测试用例。 tSQLt 需要安装在开发数据库中并添加到测试项目中,一旦发布测试项目,该项目将使用 tSQLt 和测试用例创建一个新数据库使用同义词应该适用于这种方法
猜你喜欢
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2010-10-13
  • 2016-05-19
  • 2019-07-10
相关资源
最近更新 更多