wbudowana walidacja, a testy jednostkowe modeli


Jeśli piszesz unit testy i polegasz w nich na wbudowanej walidacji – uważaj na pewną drobnostkę.

Załóżmy, że masz model Stuff, a w nim

$validate = array("name" => "notempty");

Przy formularzach dodawania działa to ok, ale teraz chcesz wykonać test:

$this->assertFalse( $this->Stuff->save( array("id"=> 1) ) ); //test fail

Niestety test nie przejdzie (zapis się uda, a nie powinien). Dlaczego?

Otóż taka walidacja jak poniżej oznacza tylko, że
Jeśli w zapisywanych danych jest element “name” to nie może być pusty (null, false, “”).

Zatem, żeby ten zapis nie przeszedł przy tak zdefiniowanej walidacji, należy zrobić:

$this->assertFalse( $this->Stuff->save( array("id"=> 1, "name"=>"") ) ); // test passed

Albo poprawić walidację na

$validate = array("name" => array("rule" =>"notempty", "required"=> true),
);

W takim wypadku zostanie pole zostanie sprawdzone, czy jest niepuste i czy istnieje.

Spędziliśmy tutaj jakieś 30minut zastanawiając się dlaczego przez formularz nie mogę zapisać czegoś nie podając “name”, a w testach jednostkowych się dało.

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Twitter
  • Wykop
  • email
  • HackerNews
  • MySpace

  1. No comments yet.
(will not be published)

Spam Protection by WP-SpamFree

  1. No trackbacks yet.