Nefungující dibi v testech
- tajo
- Člen | 20
Zdravím,
snažím se zapracovat (nejen) Unit testování do své aplikace a to stejným způsobem jako Dundee – viz https://github.com/…ing-showcase. Potíž je v tom, že se mi nějak nedaří používat v těch testech dibi.
Takhle vypadá můj config.neon:
common:
parameters:
selenium:
host: localhost
browser: firefox
browserUrl: http://localhost/
php:
date.timezone: Europe/Prague
# session.save_path: "%tempDir%/sessions"
# zlib.output_compression: yes
nette:
session:
autoStart: smart
expiration: +14 days
debugger:
strictMode: true
application:
errorPresenter: 'Error'
dibi:
driver: mysqli
host: localhost
charset: utf8
lazy: true
profiler: true
services:
authenticator: Authenticator()
cacheStorage: \Nette\Caching\Storages\FileStorage(%tempDir%)
# for testing
database:
@dibi.connection
category:
class: Category(@dibi.connection)
factories:
production < common:
development < common:
includes:
- devel.neon
Test pak vypadá nějak takto:
class ExampleTest extends PHPUnit_Framework_TestCase {
public function testExample(){
$db = \Nette\Environment::getContext()->database;
$db->query(...); // tohle nefunguje
}
}
PHP (resp PHPUnit) zakříčí Error:
1) ExampleTest::testExample
DibiDriverException: No such file or directory
/Users/Vojta/Documents/web/appshop/libs/dibi/drivers/mysqli.php:116
/Users/Vojta/Documents/web/appshop/libs/dibi/libs/DibiConnection.php:163
/Users/Vojta/Documents/web/appshop/libs/dibi/libs/DibiConnection.php:325
/Users/Vojta/Documents/web/appshop/libs/dibi/libs/DibiConnection.php:261
...
Přitom pokud někde v presenteru zavolám
\Nette\Environment::getContext()->database->query("")
, tak to
bez problémů funguje.
Rád bych se tedy dozvěděl jak elegantně dostat fungující dibi do testů (aniž bych přešel na dibi::). Chci s ním za a) rovnou provádět dotazy a za b) předat ho do konstruktoru modelu, který budu testovat.
Struktura souborů odpovídá přesně tomu od Dundee. On však používá Nette\Database…
A druhý dotázek, jak elegantně zamezit při testování tomu, aby se
v bootstrapu zavolalo $container->application->run();
(Lze
to řešit jen zcela oddělenými bootstrapy?)
Díky za pomoc!
Editoval tajo (19. 7. 2012 18:53)
- tajo
- Člen | 20
Problém vyřešen. Ukázka výše je v pořádku a funguje.
Problém byl v tom, že PHPUnit používal jiné PHPčko než můj projekt.
(Aneb XAMPP už na Mac nikdy víc). Tudíž si k té databázi nemohl ani
čuchnout.
A druhý zádrhel byl v komunikaci mezi PHP a MySQL (nastavení v /etc/php.ini
mysql.default_socket bylo potřeba změnit z /var/mysql/mysql.sock na
/tmp/mysql.sock a to samé i pro mysqli.- a pdo.-)
Aneb příjemně strávený víkend.