2012-02-23 16 views
5

Piszę niektóre testy jednostek bazy danych tSQLt (za pomocą testu SQL Red Gate) na procedurach, które ostatnio wywołują tabele zawierające (utrwalone) kolumny obliczeniowe i zauważ, że jeśli używam FakeTable SP, Uważam, że kolumny obliczane nie są wypełnione (oceniają jako zerowe). Obliczona kolumna jest kluczem do testu, więc nie mogę po prostu zignorować kolumny w teście, a raczej nie powielę logiki.Testowanie jednostkowe z tSQLt na kolumnach obliczeniowych

Oceniam wyniki przy użyciu tSQLt.AssertEqualsTable SP, więc chcę się upewnić, że wartości kolumn są takie same w obu.

W praktyce pracowałem nad tym, nie używając FakeTable, ale używając instrukcji (częściowego) wycofania transakcji na końcu testu (na blogu pod numerem http://sqlity.net/en/585/how-to-rollback-in-procedures/) lub jawnie usuwając wartości testowe.

Jestem pewien, że musi istnieć lepszy sposób kodowania tego testu i chętnie przyjmie wszelkie sugestie.

Odpowiedz

4

Powinieneś oddzielić logikę w obliczonej kolumnie od logiki w procedurze podczas testowania. Procedura zabierze informacje w tej kolumnie i podejmie odpowiednie działania. Procedura nie powinna przejmować się tym, że kolumna jest kolumną obliczeniową lub kolumną rzeczywistą. Oznacza to, że w twoim teście możesz zakodować wartość, którą chcesz umieścić w tej kolumnie. FakeTable czyni to możliwym, obracając dowolną kolumnę obliczeniową do prawdziwej kolumny.

W innym zestawie testów można (i należy) sprawdzić, czy obliczona kolumna jest obliczana poprawnie. W tym celu dostępny jest dodatek do FakeTable. Zachowuje to wyliczoną właściwość tabeli. Musisz ustawić parametr @ComputedColumn z EXECUTE tSQLt.FakeTable na 1. (http://tsqlt.org/user-guide/isolating-dependencies/faketable/)

Btw, nie musisz wycofywać niczego w teście. tSQLt już to zajmuje. Logika opisana w artykule, o którym wspomniałeś, jest potrzebna tylko w twojej własnej procedurze, jeśli zarządzanie transakcją jest wymogiem tego proc.

+0

Dzięki Sabastian, to bardzo pomocne. Próbowałem połączyć oba testy, ale jak zauważyłeś, powinny to być różne testy. – DaveGreen

3

Istnieje obecnie zmiana pre-release do tSQLt dostępny na listę mailingową: http://groups.google.com/group/tsqlt

pre-release zawiera funkcje, aby zachować kolumny obliczane lub domyślne podczas FakeTable.

Przykłady:
EXEC tSQLt.FakeTable 'dbo.tst1', @ComputedColumns = 1;
EXEC tSQLt.FakeTable 'dbo.tst1', @Defaults = 1;

Będą wkrótce gotowe do oficjalnego wydania.

Powiązane problemy