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.