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.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>