Модульный тест базы данных TSQLT - PullRequest
0 голосов
/ 23 марта 2020

Я впервые пытаюсь использовать TSQLT unittest framework и столкнулся с проблемой. У меня есть сохраненный pro c, подобный этому, который возвращает некоторые числа

Use Mydatabase
Declare @parameter1, @parameter2,@paramter3

BEGIN
SELECT @parameter1 = dbo.[function](@paramter2,parameter3)
..
..

-- Now some Dynamic SQL joins on two tables
BEGIN
SET @SQL = 'SELECT COLUMN1, COLUMN2 FROM  FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.COLUMN1 = 
            TABLE2.COLUMN2 WHERE TABLE2.COLUMN3 = + CAST(@parameter1 as varchar(10))
EXECUTE sp_executesql @SQL, Output parameter
return

Проблема в том, что table1 и table2 обновляются ежедневно, и я не могу утверждать, что значения меняются, поэтому я натолкнулся на поддельные таблицы и шпионские процедуры,

  1. Есть ли способ использовать spyprocedures для использования поддельных таблиц, а не оригинальных таблиц? но с тем же соединением, как я могу ссылаться на фактическое на тестовое, так как я получаю ошибку как

    Невозможно использовать SpyProcedure на [WD0000 \ server]. [database]. [dbo]. [usp.mystoredproc ] потому что процедура не существует

TSQLT код

    EXEC tSQLt.NewTestClass 'SegmentSizeTest'
GO
CREATE PROCEDURE SegmentSizeTest.[test that checks the segment size]
AS
BEGIN
    DECLARE @return_value int,@TotalCount int,@OneCount int,@TwoCount int
    declare @Criteria Varchar(MAX)
    declare @rampUpFactor int
    declare @expected int
    declare @actual int


SET @Criteria = 'My Criteria'
SET @GeoflexCriteria = NULL
 --@TotalCount = @TotalCount OUTPUT
 --@OneCount = @OneCount OUTPUT
    --  @TwoCount = @TwoCount OUTPUT
SET @rampUpFactor = 1
set @expected = 160486

------Fake Table
    EXEC tSQLt.FakeTable 'UnitTest.Household';
    EXEC tSQLT.FakeTable 'UnitTest.Customer';
--
..Insert to UnitTest.Household and UnitTest.Customer tables

------Execution

EXEC    @return_value = [VAReportingDB].[dbo].[GetSegmentSize] 
        @Criteria = @Criteria,
        @TotalCount = @TotalCount OUTPUT,
        @OneCount = @OneCount OUTPUT,
        @TwoCount = @TwoCount OUTPUT

SELECT  @TotalCount as N'@TotalCount',
        @OneCount as N'@OneCount',
        @TwoCount as N'@TwoCount'

------Assertion
    EXEC tSQLt.AssertEquals @expected, @TotalCount;
END;
GO

1 Ответ

0 голосов
/ 23 марта 2020

FakeTable заменяет исходную таблицу с двойным тестом. Поэтому любой код, который написан для доступа к исходной таблице, динамически или иным образом, «увидит» поддельную таблицу во время теста.

Независимо, вы должны передать @ параметр1 в sp_execute sql вместо того, чтобы объединить его в свой оператор Sql. По крайней мере, если ваш оригинальный код похож на то, что вы разместили здесь.

...