Datový model testujeme unit testy. Pro každý datový model máme jeden soubor s testy v adresáři test/unit/
jenž je pojmenován podle vzoru
model
_test.rb
Používáme také „fixtures“, datové záznamy definované v textovém souboru. Ten se nachází v adresáři test/fixtures/
a jemnuje se po datové tabulce do níž se záznamy v něm definované zapisují.
Aby se nám dále snadno pracovalo, uvedeme si konkrétní příklad. Mějme tabulku jenž je definována/vytvářena sql příkazem
CREATE TABLE hosts ( id SERIAL PRIMARY KEY, name VARCHAR(24) UNIQUE --natural primary key );
Pro tuto tabulku hosts
máme vytvořen model Host
. Připravíme si tedy nejdříve „fixtures“ v souboru pojmenovaném po této tabulce, tedy test/fixtures/hosts.yml
. Původní, vygenerovaný, obsah nahradíme svými dvěma pojmenovanými záznamy.
sunrise: id: 1 name: sunrise yoda: id: 2 name: yoda
v našm příkladě mi pěkně vyšlo, že záznamy pojmenovávám stejným jménem které je v sloupečku/poli name. Jméno záznamu nemá jiný význam, než že je pod ním daný záznam přístupný v době testování. Mohl uvedené fixtures napsat také takto
prvni_stroj: id: 1 name: sunrise dalsi_stroj: id: 2 name: yoda
Fixtures máme hotové, a můžeme přistoupit k testování. V souboru test/unit/host_test.rb
máme po vytvoření jednoduchý, prázdný, test test_truth
. Tento můžeme odstranit, protože uvedeme vlastní testy. Jako první otestujeme naše fixtures, zdali je máme ke dispozici.
# Are all fixtures presented? def test_fixtures_presence assert_kind_of Host, hosts(:sunrise) assert_kind_of Host, hosts(:yoda) end
Testujeme zdali fixtures existují a jsou daného typu, vyhovují našemu modelu. Po napsání tohoto prvního testu jej již můžeme spustit. Použijeme příkaz
$
rake test:units
Testy proběhnou bez chyby. V této chvíli jsme se dopustili malého prohřešku na metodologii extreémního programování, přesněji části TDD (Test Driven Development). Měli jsme nejdříve napsat test test_fixtures_presence
a teprve po neúspěšnýh testech upravit soubor s fixtures.
Nyní přistoupíme k testování základních operací nad modelem. Jedná se o operace Create, Read, Update a Delete. Někdy jsou dohromady nazývány také CRUD. Náš test se tedy bude jmenovat test_crud
. Napíšeme si tedy jeho kostru, prázdnou metodu s komentáři na jejichž místo budeme psát kód.
def test_crud # Create # Read # Update # Delete end
Nejdříve tedy vytvoření záznamu. V prvním příkazu si vytvoříme nový záznam jež má v poli name
řetězec joshua
a v druhém řádku jej uložíme do databáze.
# Create joshua = Host.new(:name => 'joshua') assert joshua.save
Po dopsání uvedených dvou řádků můžeme, a taky to doporučuji, opět spustit testy. Měly by proběhnout bez chybičky. Pokud nějaká nastala, máme problém k řešení. V tomto okamžiku mě napadá že by mohl nastat problém zápisu do databáze, například pro nedostatečná oprávnění, případně z tuctu dalších důvodů. Protože ovšem náš test uspěl, přikročíme k napsání dalšího. Budeme testovat čtění. V prvním příkazu načítáme z tabulky náš záznam, identifikovaný číslem id
. Využijeme toho, že v objektu jsohua
máme zapsáno jeho id
. V následujících dvou řádcích srovnáváme obsah pole name
s hodnotou jenž očekáváme.
# Read host = Host.find(joshua.id) assert_equal joshua.name, host.name assert_equal 'joshua', host.name
Spustíme testy. Opět žádná chybička. Můžeme tedy napsat test pro změnu záznamu. V naší tabulce máme jen jeden sloupec s daty, takže skusíme u již nalezeného stroje joshua
jenž je uložen v proměnné host
změnit jeho jméno například na hola
. To provedeme prvním příkazem. Ve druhém ttestujeme že zápis proběhl bez problémů.
# Update host.name = 'hola' assert host.save
Pokud proběhl test bez problémů, můžeme napsat v této metodě poslední test. Test mazání záznamu. Využijeme toho že máme od předchozích testů v proměnné host
vytvořený záznam a ten smažeme.
# Delete assert host.destroy
Pokud i teď proběhnou všechny testy bez problému máme otestovánu a zaručenu základní funkcionalitu datového modelu. Před tím než se budeme věnovat další činnosti, je vhodné zaslat všechny změny do subversion repositáře.