Возможно с несколькими подключениями к базе данных

Новичок в мире tSQLt (отличный набор инструментов) и обнаружил незначительную проблему с хранимой процедурой, для которой я настраиваю тест.

Если у меня по какой-то причине есть хранимая процедура, которая подключается к нескольким базам данных или даже к нескольким SQL-серверам (Linked Servers).

Можно ли проводить модульные тесты с tSQLt в таком сценарии?

2 ответа

Решение

Я уже прокомментировал, но я хотел бы добавить еще. Итак, как я уже сказал, вы можете делать все, что вписывается в одну транзакцию.

Но для вашего случая я бы предложил создать синонимы для каждого кросс-объекта базы данных / экземпляра, а затем использовать синонимы везде.

Я создал следующую функцию для макета синонимов представления / таблиц. У него есть некоторые ограничения, но, по крайней мере, он может обрабатывать простые варианты использования.

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, вы можете сделать что-то вроде этого:

Представьте, что у вас есть процедура, которая выбирает строку из таблицы с именем 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

Приведенный выше код демонстрирует основы, но я написал об этом более подробно несколько лет назад здесь.

К сожалению, этот подход не будет работать на связанных серверах,

Другие вопросы по тегам