Witam być może taki temat był już poruszany na temat. Przeglądałem pobieżnie i nie znalazłem. Interesuje mnie programowanie sterowane testami. Mam już napisany spory kawałek aplikacji, jednakże kiedy dochodzi do dorabiania funkcjonalności, zawsze istnieje możliwość pojawienia się błędów.

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.
  1. <?
  2. class UserModule extends Module
  3. {
  4. function __construct()
  5. {
  6. //default properties for a new invoice
  7. $this->defaultUser=array(
  8. 'Login' => '',
  9. 'Forename' => '',
  10. 'Surname' => '',
  11. 'Mailing' => '',
  12. 'Mail' => '',
  13. );
  14.  
  15. $this->defaultPublicity=array(
  16. 'Kind' => '',
  17. 'Frequency' => ''
  18. );
  19. }
  20.  
  21.  public function insert($smarty){
  22. $errors = array();
  23. $user = new User();
  24. $publicity = new Publicity();
  25.  
  26. if ($save=GetSafeInput('save', false))
  27. {
  28. $data=GetMergedInput($this->defaultUser);
  29. #tutaj nastepuje walidacja danych
  30. $errors=$user->importArray($data);
  31.  
  32. #tutaj nastepuje walidacja danych
  33. $data=GetMergedInput($this->defaultPublicity);
  34. $errors=$publicity->importArray($data);
  35.  
  36.  
  37. if (count($errors)==0){
  38. try {
  39. #zamkniecie w transakcji 3 nowe rekordy w 3 roznych tabelach musza byc operacja 
    atamowa
  40. User::beginTransaction()
  41. $user->create();
  42. if ($user->getMailing()==1){
  43. $publicity->setUser($user);
  44. $publicity->create();
  45. }
  46.  
  47. #wyslij maila z zawiadomienem
  48. # Mailing::sendMail(User user, int templateId);
  49. Mailing::sendMail($user, 2);
  50. User::commitTransaction();
  51. RedirectSelf("greeting", array('dt'=>$dt));
  52. }
  53. catch(Exception $ex){
  54. User::rollbackTransaction();
  55. $errors[] = $ex->getMessage();
  56. }
  57. }
  58. }
  59. $smarty->assign('user', $user);
  60. $smarty->assign('publicity', $publicity);
  61. $smarty->assign('errors', $errors);
  62. return $smarty->fetch('insert.tpl');
  63. }
  64. }
  65. ?>


test
  1. <?
  2. #require’y do klas aplikacji
  3. //requ
  4.  
  5. class test1 extends UnitTestCase {
  6. private $author_id;
  7.  
  8.  function test_insert(){
  9.  
  10. $_REQUEST['savet'] = 'submit';
  11. $_REQUEST['Forename'] = 'Jan';
  12. $_REQUEST['Surname'] = 'Kowalski';
  13. $_REQUEST['Login’] = 'KJan';
  14. $_REQUEST['Mailing'] = '1';
  15. $_REQUEST['Mail] = 'kowalski@xxx.pl';
  16. $_REQUEST['Frequency’] =  3; 
  17. $_REQUEST['Kind'] = 2;
  18. $userModule = new UserModule();
  19. $userModule ->insert(new MySmarty());
  20. #sprawdz dane w bazie
  21. }
  22.  
  23. function tearDown(){
  24. #tutaj ewentualne wyczyszczenie bazy
  25.  
  26. }
  27. ?>


seaquest: proszę używać BBCode i na przyszłość nie umieszczać tak długich kodów