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
+
0
-

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
+
0
-
  1. 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
  2. v catch mas kontrolu na string ‚23000‘ s ===, ale vyhazujes kod 23000 jako int
  3. pokud se jedna o neco jinyho, nez ten typ, co chces chytit (tedy 23000), tak bys mel vyjimku pustit dal (throw $e)
  4. nove nette to zjednodusuje a vyhazuje UniqueConstraintViolationException
David Grudl
Nette Core | 8218
+
0
-

Ten kód 23000 je skutečně řetězec.

David Matějka
Moderator | 6445
+
0
-

@DavidGrudl narazel jsem na to, ze v tom testu se snazi vyhodit vyjimku s intem 23000

David Grudl
Nette Core | 8218
+
0
-

Jo ták, sry

tk
Člen | 6
+
0
-

Ta metoda save ale výjimku sama hned odchytává, proto test správně hlásí, že žádná vyhozena nebyla.

Namespace
Člen | 80
+
0
-

Máte pravdu, vymýšlím blbosti. Metoda má vracet TRUE/FALSE a ne Exception.

Díky :)