Nette Tester a PDOException
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Namespace
- Člen | 80
Ahoj,
mořím se s tím už druhý den a stále netuším.
Mám v modelu metodu pro ukládání dat
<?php
public function save($data)
{
try {
$this->db->table(self::TABLE_NAME)->insert($data);
} catch (\PDOException $ex) {
if ($ex->getCode() === '23000') {
return FALSE;
}
}
return TRUE;
}
?>
a k tomu test
<?php
public function testSave()
{
Assert::exception(function(){
$db = $this->db; //Mock databaze pomoci mockery/mockery
$db->shouldReceive('table->insert')->once()->andThrow(new \PDOException, 'Integrity constraint violation: 1062', 23000);
$uploadTest = new \App\Model\UploadManager($db);
$uploadTest->save(['test']);
}, 'PDOException');
}
?>
Ale neustále dostávám
<?php
Failed: PDOException was expected, but none was thrown in testSave()
?>
Pravděpodobně nerozumím tomu, jak funguje Assert::exception. Můžete mě někdo nakopnout správným směrem?
Díky
- David Matějka
- Moderator | 6445
- andThrow akceptuje BUD jeden parametr s objektem vyjimky (a tedy i textem a kodem) NEBO jako prvni parametr tridu vyjimky a jako dalsi text a kod
- v catch mas kontrolu na string ‚23000‘ s
===
, ale vyhazujes kod 23000 jako int - pokud se jedna o neco jinyho, nez ten typ, co chces chytit (tedy 23000),
tak bys mel vyjimku pustit dal (
throw $e
) - nove nette to zjednodusuje a vyhazuje
UniqueConstraintViolationException
- David Matějka
- Moderator | 6445
@DavidGrudl narazel jsem na to, ze v tom testu se snazi vyhodit vyjimku s intem 23000