I teraz zasadnicze pytanie, nie wiem jak napisać testy do mojej aplikacji, być może jej architektura jest zła. W przykładach, które mam 1 metoda klasy testowej dziedziczącej z UnitTestCase testuje 1 metodę klasy aplikacji (np. walidacja e-mail)
W mojej aplikacji moduły są klasami, klasy te posiadają metody , w których wywoływane są metody różnych klas reprezentujących obiekty biznesowe aplikacji. To jest przykład wymyślony na poczekaniu, czasem bywa że mam w metodzie modułu większe zależności niż te przedstawione poniżej. Pytanie czy może wszystkie zależności powinny być w tym przypadku zamknięte w metodzie create klasy User, tzn zapisanie czy użytkownik chce dostawać reklamówki i wysłanie do niego maila z potwierdzeniem. Jeśli tak to metoda create powinna być z parametrem. Dodatkowo metoda importArray zwraca ewentualne błedy walidacyjne.
Pytanie, klasa UserModule ma metodę insert(która nie zwraca nic , wypełnia tylko szablon), wiec czy test powinien być napisany do niej? Czy może do wszystkich metod klas w niej zawartych, czy może wszystkie te operacje powinny być zawarte w metodzie create klasy User(co w tym przypadku jest możliwe ale w przypadku wielu kontrolek decyzyjnych na formularzu może być trudne.) Bardzo was proszę o pomoc, rady, sugestie, myślę, że jest to ciekawe zagadnienie i wielu ludzi skorzysta dzięki rozwinięciu tego wątku. Poniżej zamieszczam przykładowy kod klasy modułu i mój przykładowy kod testujący.
<? class UserModule extends Module { function __construct() { //default properties for a new invoice 'Login' => '', 'Forename' => '', 'Surname' => '', 'Mailing' => '', 'Mail' => '', ); 'Kind' => '', 'Frequency' => '' ); } public function insert($smarty){ $user = new User(); $publicity = new Publicity(); if ($save=GetSafeInput('save', false)) { $data=GetMergedInput($this->defaultUser); #tutaj nastepuje walidacja danych $errors=$user->importArray($data); #tutaj nastepuje walidacja danych $data=GetMergedInput($this->defaultPublicity); $errors=$publicity->importArray($data); try { #zamkniecie w transakcji 3 nowe rekordy w 3 roznych tabelach musza byc operacja
atamowa User::beginTransaction() $user->create(); if ($user->getMailing()==1){ $publicity->setUser($user); $publicity->create(); } #wyslij maila z zawiadomienem # Mailing::sendMail(User user, int templateId); Mailing::sendMail($user, 2); User::commitTransaction(); } catch(Exception $ex){ User::rollbackTransaction(); $errors[] = $ex->getMessage(); } } } $smarty->assign('user', $user); $smarty->assign('publicity', $publicity); $smarty->assign('errors', $errors); return $smarty->fetch('insert.tpl'); } } ?>
test
<? #require’y do klas aplikacji //requ class test1 extends UnitTestCase { private $author_id; function test_insert(){ $_REQUEST['savet'] = 'submit'; $_REQUEST['Forename'] = 'Jan'; $_REQUEST['Surname'] = 'Kowalski'; $_REQUEST['Login’] = 'KJan'; $_REQUEST['Mailing'] = '1'; $_REQUEST['Frequency’] = 3; $_REQUEST['Kind'] = 2; $userModule = new UserModule(); $userModule ->insert(new MySmarty()); #sprawdz dane w bazie } function tearDown(){ #tutaj ewentualne wyczyszczenie bazy } ?>
seaquest: proszę używać BBCode i na przyszłość nie umieszczać tak długich kodów