Velestručné testování presenterů v Nette – Nette 2.1
- motorcb
- Člen | 552
Zdravím.
Snažím se podle článku – https://phpfashion.com/…teru-v-nette
zprovoznit testování v Nette.
bootstrap.php:
<?php
include __DIR__ . '/vendor/autoload.php';
Tester\Helpers::setup();
class_alias('Tester\Assert', 'Assert');
date_default_timezone_set('Europe/Prague');
define('TEMP_DIR', __DIR__ . '/tmp/' . getmypid() );
if(extension_loaded('xdebug'))
{
xdebug_disable();
Tester\CodeCoverage\Collector::start(
__DIR__ . '/coverage.dat'
);
}
Tester\Helpers::purge(TEMP_DIR);
test.phpt:
<?php
require __DIR__ . '/../bootstrap.php';
/*
//toto funguje
Assert::true(2*2 === 4);
Assert::same("a", "a");
Assert::null(NULL);
*/
// z DI kontejneru, který vytvořil bootstrap.php, získáme instanci PresenterFactory
$presenterFactory = $container->getByType('Nette\Application\IPresenterFactory');
Kde vemu $container?
- jiri.pudil
- Nette Blogger | 1029
Vytvoříš si ho v bootstrapu (jak je ostatně zmíněno v tebou odkazovaném článku).
- motorcb
- Člen | 552
@jiri.pudil:
Díky, pohnul jsem se :-)
-- FAILED: E:\www\project\tester\tests\login.phpt | tester\tests\test.phpt
Fatal error: Call to undefined function Nette\Utils\mb_convert_encoding() in E:\www\project\libs\Nette\Utils\Strings.php on line 60
bootstrap.php:
<?php
include __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/../libs/autoload.php';
Tester\Helpers::setup();
class_alias('Tester\Assert', 'Assert');
date_default_timezone_set('Europe/Prague');
define('TEMP_DIR', __DIR__ . '/tmp/' . getmypid() );
if(extension_loaded('xdebug'))
{
xdebug_disable();
Tester\CodeCoverage\Collector::start(
__DIR__ . '/coverage.dat'
);
}
Tester\Helpers::purge(TEMP_DIR);
$configurator = new Nette\Configurator;
$configurator->setDebugMode(FALSE);
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(__DIR__ . '/../app')
->register();
$configurator->addConfig(__DIR__ . '/../app/config/config.neon');
$configurator->addConfig(__DIR__ . '/../app/config/config.local.neon');
return $configurator->createContainer();
- jiri.pudil
- Nette Blogger | 1029
-- FAILED: E:\www\project\tester\tests\login.phpt | tester\tests\test.phpt Fatal error: Call to undefined function Nette\Utils\mb_convert_encoding() in E:\www\project\libs\Nette\Utils\Strings.php on line 60
Vypadá to, že nemáš v PHP povolené mbstring. Víc ti řekne requirements checker.
- xlilien
- Člen | 27
motorcb napsal(a):
@jiri.pudil:
Díky, pohnul jsem se :-)
-- FAILED: E:\www\project\tester\tests\login.phpt | tester\tests\test.phpt Fatal error: Call to undefined function Nette\Utils\mb_convert_encoding() in E:\www\project\libs\Nette\Utils\Strings.php on line 60
Mě pomohlo změnit kódování souboru na UTF-8.
- Morlok
- Člen | 26
xlilien napsal(a):
motorcb napsal(a):
@jiri.pudil:
Díky, pohnul jsem se :-)
-- FAILED: E:\www\project\tester\tests\login.phpt | tester\tests\test.phpt Fatal error: Call to undefined function Nette\Utils\mb_convert_encoding() in E:\www\project\libs\Nette\Utils\Strings.php on line 60
Mě pomohlo změnit kódování souboru na UTF-8.
Ahoj, tiez mam podobny problem. Ked spustam na localhoste web mbstring mam medzi installed modules, ale ked spustam tester uz tam nie je. Pozeram ze funkcia Strings::fixEncodings overuje ci je instalovana verzia PHP 5.4, co mam ale neviem preco ten modul nie je dostupny v testovani. Ked spustam index.php cez konzolu (Symfony console) tak ten modul tam je dostupny. Mam Windows 7, XAMPP. Vedel by niekto ako to fixnut?
- jiri.pudil
- Nette Blogger | 1029
Tester by default spouští PHP bez konfiguráku. Musíš mu předat cestu
k php.ini (parametrem -c
).
- rp
- Člen | 20
Přidávám syntax s uvedením konfiguráku, protože já jsem dával option „-c“ na špatné místo:
php "/cesta/k/tester/tester.php" -j 30 -c "cesta\k\php.ini" MyExampleTest.phpt
(na správné řešení mě přivedl http://www.michalhaltuf.cz/…z-composeru/)
Ještě před tím jsem se pokoušel zjistit, zda je funkce
mb_convert_encoding()
dostupná z CLI. Provedl jsem to přes
interaktivní mód v příkazové řádce (viz. Jakub Vrána 1001 … tip
38).
`>php -a
Interactive mode enabled
<?php
$foo = mb_convert_encoding("č", "UTF-8");
echo $foo;
?>
^Z
┬č`
Ctrl-Z (^Z) je znamení pro php, že chceme kód vykonat. A ten poslední
řádek je výstup. Konverze tedy proběhla. To mě zmátlo, protože z toho
vyplývá, že mb_convert_encoding()
je v CLI dostupná. Zřejmě
to ale automaticky neznamená, že je dostupná pro tester.php
.
Editoval rp (7. 11. 2013 11:29)
- Jan Tvrdík
- Nette guru | 2595
@rp: Pokud se nemýlím, tak Tester úmyslně ignoruje automaticky dohledané php.ini. Je potřeba ho vždy předat explicitně.
- VladimirHans
- Člen | 12
Ahoj, mám test též napsaný podle článku.
Tester mi hodí chybu:
[merkur@Poseidon tests]$ php "/var/www/html/sandbox/vendor/nette/tester/Tester/tester.php" -c "/etc/php.ini" ./presenters/ExampleTest.phpt
PHP Warning: Module 'mbstring' already loaded in Unknown on line 0
PHP Warning: Module 'mysql' already loaded in Unknown on line 0
PHP 5.3.3 | 'php-cgi' -n -c '/etc/php.ini' | 1 threads
F
-- FAILED: tests/presenters/ExampleTest.phpt
Exited with error code 255 (expected 0)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="description" content="">
<title>SIGN IN
</title>
<link rel="stylesheet" media="screen,projection,tv" href="/css/screen.css">
<link rel="stylesheet" media="print" href="/css/print.css">
<link rel="shortcut icon" href="/favicon.ico">
</head>
...
FAILURES! (1 tests, 1 failures, 0.1 seconds)
Předpokládám nevalidní html kód, ale nevím, jak na to. Testuji neupravovaný sandbox.
- VladimirHans
- Člen | 12
Hodí to chybu:
Fatal error: Class 'DOMDocument' not found in /var/www/html/nette/vendor/nette/tester/Tester/Framework/DomQuery.php on line 27
- VladimirHans
- Člen | 12
Doinstaloval jsem php-xml, přidal do php.ini extension=dom.so
.
Pokud to spustím jako normální skript, tak se v prohlížeči nic neobjeví
a ani v logu apache nic není. Nette tester hází pořád tu samou chybu.
- zool
- Člen | 144
Ahoj, zkusil jsem rozchodit test na připraveném examplu a šlo to bez problému. Ale když jsem si napsal vlastní test, tak mi to vyhodilo tuto chybu, nevíte kde může být problém? Děkuju
PHP 5.4.7 | "php-cgi" -n -c "D:\xampp1\php\php.ini" | 1 threads
F
-- FAILED: shop\tests\ExampleTest.php
Exited with error code 255 (expected 0)
E_WARNING: DOMDocument::loadHTML(): Tag banner invalid in Entity, line: 28
in Tester\Framework\DomQuery.php(29)
in Tester\Framework\DomQuery.php(29) DOMDocument->loadHTML()
in shop\tests\ExampleTest.php(19) Tester\DomQuery::fromHtml()
FAILURES! (1 tests, 1 failures, 1.3 seconds)
Zastavi se to na tomto radku
$dom = \Tester\DomQuery::fromHtml($html);
- Jan Tvrdík
- Nette guru | 2595
@zool: zřejmě to máš blbě, když ti to háže warning. Nevím, co konkrétního ti poradit. Prostě oprav to HTML aby bylo syntakticky v pořádku.
- zool
- Člen | 144
Jan Tvrdík napsal(a):
@zool: zřejmě to máš blbě, když ti to háže warning. Nevím, co konkrétního ti poradit. Prostě oprav to HTML aby bylo syntakticky v pořádku.
No je pravda, ža na řádku 28 mám
<banner class=„banner“ from=‚10‘>, ale to je nový tag, který
jsem vytvořil pomocí angularjs, když jsem to ale odstranil, tak se to
zastavilo na
E_WARNING: DOMDocument::loadHTML(): Tag nav invalid in Entity, line: 40
To nebere html5? Protože tag nav je již standardem, nebo se pletu?
- Jan Tvrdík
- Nette guru | 2595
zool napsal(a): To nebere html5? Protože tag nav je již standardem, nebo se pletu?
Ne nebere. A ano pleteš se, HTML 5 ještě není schválený standard.
- Casper
- Člen | 253
Nicméně i validní HTML dokument dle W3C validátoru může skončit na
chybě, například
DOMDocument::loadHTML(): Unexpected end tag : div in Entity
. Viz
například takovýto kód:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>title</title>
<link rel="stylesheet" href="style.css">
<script src="jquery.js"></script>
<script type="text/javascript">
$(function () {
$("body").append("<div>Content</div>");
});
</script>
</head>
<body>
</body>
</html>
- Jan Tvrdík
- Nette guru | 2595
@Casper: Z pohledu HTML 4 validní není http://validator.webylon.info/check?…
Je potřeba to zapsat takto:
<script type="text/javascript">
$(function () {
$("body").append("<div>Content<\/div>");
});
</script>
- David Grudl
- Nette Core | 8218
Btw, pro HTML5 by se asi dalo využít https://github.com/…html5lib-php. Zápis je trošku tricky:
$dom = simplexml_import_dom(HTML5_Parser::parse(file_get_contents($file)), 'Tester\DomQuery');
- VladimirHans
- Člen | 12
Milo napsal(a):
Tak –info mi vypíše:
PHP binary
----------
(not available)
PHP version
-----------
5.3.20 (cgi-fcgi)
Loaded php.ini files
--------------------
/etc/php.ini
Loaded extensions
-----------------
bz2, calendar, cgi-fcgi, Core, ctype, date, dom, ereg, exif, filter, ftp, gettext, gmp, hash, iconv, libxml, mbstring, mhash, openssl, pcntl, pcre, readline, Reflection, session, shmop, SimpleXML, sockets, SPL, standard, tokenizer, xml, zlib
- Milo
- Nette Core | 1283
David Grudl napsal(a):
@milo: hele, na Linuxu se musí ty rozšíření pro DOM zvlášť povolovat?
Na Debianu (wheezy) ne. Zakompilované moduly:
php -n -m
[PHP Modules]
bcmath
bz2
calendar
Core
ctype
date
dba
dom
ereg
exif
fileinfo
filter
ftp
gettext
hash
iconv
json
libxml
mbstring
mhash
openssl
pcntl
pcre
Phar
posix
Reflection
session
shmop
SimpleXML
soap
sockets
SPL
standard
sysvmsg
sysvsem
sysvshm
tokenizer
wddx
xml
xmlreader
xmlwriter
zip
zlib
- VladimirHans
- Člen | 12
Milo napsal(a):
David Grudl napsal(a):
@milo: hele, na Linuxu se musí ty rozšíření pro DOM zvlášť povolovat?
Na Debianu (wheezy) ne. Zakompilované moduly:
V případě debianu a na něm postavených distribucí je dom již zakompilovaný v php, RedHat to má jako zvláštní balíček (php-xml), který se instaluje samostatně (pokud se nenainstaluje při instalaci systému a nebo s něčím jiným při řešení závislostí balíčků).