2017-12-08 5 views
0

tSQLt world (훌륭한 도구 세트)에 새로 추가되었으며 저장 프로 시저에 사소한 문제가있어서 테스트를 설정하고 있습니다.다중 데이터베이스 연결이 가능합니다

만약 내가 여러 데이터베이스 또는 심지어 여러 SQL 서버 (연결된 서버)에 연결하는 저장 프로 시저가 있습니다.

이러한 시나리오에서 tSQLt를 사용하여 단위 테스트를 수행 할 수 있습니까?

+0

, 감사 내가 분산 트랜잭션에 관련된 몇 가지 추가 질문을 가지고 있지만 그들은 내가 같이 범위를 벗어 그것을 참조하십시오 –

답변

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 '''[email protected]+''', '''[email protected]+''';'; 

     EXEC tSQLt.SuppressOutput 
       @RenameCmd; 

     DECLARE @sql VARCHAR(MAX)= 'SELECT * INTO '[email protected]+' FROM '[email protected]+' WHERE 1=2;'; 

     EXEC (@sql); 

     EXEC tSQLt.FakeTable 
       @TableName = @SynonymTable; 
    END; 
+0

큰 단일 트랜잭션에 맞는 아무것도 할 수 – plykkegaard

1

샘플 코드를 제공하지 않으면 정확한 사용 사례는 아니지만이 정보가 도움이 될 수 있습니다.

데이터베이스 간 테스트 (두 데이터베이스가 같은 인스턴스에 있다고 가정)에 대한 대안 방법은 두 데이터베이스에 모두 tSQLt를 설치하는 것입니다. 그런 다음 로컬 데이터베이스와 동일한 방법으로 원격 데이터베이스의 객체를 모의 할 수 있습니다.

예. RemoteDb의 테이블을 참조하는 LocalDb의 저장 프로 시저가있는 경우 다음과 같이 할 수 있습니다.

로컬 데이터베이스의 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 더 자세히 이것에 대해 블로그.

불행하게도 연결된 서버에서 작동하지 않습니다이 방법,

당신은
+0

고마워, 네 조금 vaqueu되고 죄송합니다 이 블로그에 설명 된대로 테스트 프로젝트를 구성했습니다 : https://kzhendev.wordpress.com/2014/01/08/setting-up-ssdt-database- projects-and-tsqlt/ 기본적으로 실제 구현을위한 프로젝트와 테스트 사례를위한 추가 프로젝트라는 두 개의 데이터베이스 프로젝트가 있습니다. 테스트 데이터베이스에 tSQLt를 설치하고 테스트 프로젝트가 게시 된 후 tSQLt 및 테스트 케이스를 사용하여 새 데이터베이스를 만든 테스트 프로젝트에 추가해야합니다. synomyms를 사용하면이 접근 방식을 사용할 수 있습니다. – plykkegaard

관련 문제