Velestručné testování presenterů v Nette – Nette 2.1

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
motorcb
Člen | 552
+
0
-

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

Vytvoříš si ho v bootstrapu (jak je ostatně zmíněno v tebou odkazovaném článku).

motorcb
Člen | 552
+
0
-

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

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

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

Tester by default spouští PHP bez konfiguráku. Musíš mu předat cestu k php.ini (parametrem -c).

Morlok
Člen | 26
+
0
-

jiri.pudil napsal(a):

Tester by default spouští PHP bez konfiguráku. Musíš mu předat cestu k php.ini (parametrem -c).

Ďakujem za radu, po nastaveni cesty to uz funguje.

rp
Člen | 20
+
0
-

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

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

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.

David Grudl
Nette Core | 8218
+
0
-

Spusť test jako normální skript, co ti to hodí za chybu.

VladimirHans
Člen | 12
+
0
-

Hodí to chybu:

Fatal error: Class 'DOMDocument' not found in /var/www/html/nette/vendor/nette/tester/Tester/Framework/DomQuery.php on line 27
David Grudl
Nette Core | 8218
+
0
-

Je možné, že máš zkompilované PHP bez rozšířeních dom a simplexml?

VladimirHans
Člen | 12
+
0
-

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

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

@VladimirHans: Koukni schválně na výpis testeru s parametrem --info.

Jan Tvrdík
Nette guru | 2595
+
0
-

@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.

VladimirHans
Člen | 12
+
0
-

@Jan Tvrdík: Tak to mi vyhodí unknown option --info

zool
Člen | 144
+
0
-

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?

Milo
Nette Core | 1283
+
0
-

VladimirHans napsal(a):

@Jan Tvrdík: Tak to mi vyhodí unknown option --info

composer update

Parametr --info je od Testeru verze 1.0.0

Jan Tvrdík
Nette guru | 2595
+
0
-

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.

Viz také https://forum.nette.org/…omhtml-error

Casper
Člen | 253
+
0
-

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

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

@milo: hele, na Linuxu se musí ty rozšíření pro DOM zvlášť povolovat?

David Grudl
Nette Core | 8218
+
0
-

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

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

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

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ů).