Nette Documentation Preview

syntax
Pomožni razredi
***************


DomQuery
--------
`Tester\DomQuery` je razred, ki razširja `SimpleXMLElement` z enostavnim iskanjem v HTML ali XML s pomočjo CSS selektorjev.

```php
# ustvarjanje DomQuery iz HTML niza
$dom = Tester\DomQuery::fromHtml('
	<article class="post">
		<h1>Naslov</h1>
		<div class="content">Besedilo</div>
	</article>
');

# test obstoja elementov s pomočjo CSS selektorjev
Assert::true($dom->has('article.post'));
Assert::true($dom->has('h1'));

# iskanje elementov kot polje DomQuery objektov
$headings = $dom->find('h1');
Assert::same('Naslov', (string) $headings[0]);

# test, ali element ustreza selektorju (od različice 2.5.3)
$content = $dom->find('.content')[0];
Assert::true($content->matches('div'));
Assert::false($content->matches('p'));

# iskanje najbližjega prednika, ki ustreza selektorju (od 2.5.5)
$article = $content->closest('.post');
Assert::true($article->matches('article'));
```


FileMock
--------
`Tester\FileMock` emulira datoteke v pomnilniku in tako olajša testiranje kode, ki uporablja funkcije `fopen()`, `file_get_contents()`, `parse_ini_file()` in podobne. Primer uporabe:

```php
# Testirani razred
class Logger
{
	public function __construct(
		private string $logFile,
	) {
	}

	public function log(string $message): void
	{
		file_put_contents($this->logFile, $message . "\n", FILE_APPEND);
	}
}

# Nova prazna datoteka
$file = Tester\FileMock::create('');

$logger = new Logger($file);
$logger->log('Prijava');
$logger->log('Odjava');

# Testiramo ustvarjeno vsebino
Assert::same("Prijava\nOdjava\n", file_get_contents($file));
```


Assert::with() .[filter]
------------------------
Ne gre za asercijo, ampak pomočnika za testiranje zasebnih metod in lastnosti objektov.

```php
class Entity
{
	private $enabled;
	// ...
}

$ent = new Entity;

Assert::with($ent, function () {
	Assert::true($this->enabled); // dostopna zasebna $ent->enabled
});
```


Helpers::purge() .[filter]
--------------------------
Metoda `purge()` ustvari navedeni imenik, in če že obstaja, izbriše celotno njegovo vsebino. Uporabno za ustvarjanje začasnega imenika. Na primer v `tests/bootstrap.php`:

```php
@mkdir(__DIR__ . '/tmp');  # @ - imenik že lahko obstaja

define('TempDir', __DIR__ . '/tmp/' . getmypid());
Tester\Helpers::purge(TempDir);
```


Environment::lock() .[filter]
-----------------------------
Testi se izvajajo vzporedno. Včasih pa potrebujemo, da se izvajanje testov ne prekriva. Tipično pri podatkovnih testih je nujno, da si test pripravi vsebino podatkovne baze in da mu drug test med izvajanjem ne posega v podatkovno bazo. V teh testih uporabimo `Tester\Environment::lock($name, $dir)`:

```php
Tester\Environment::lock('database', __DIR__ . '/tmp');
```

Prvi parameter je ime ključavnice, drugi je pot do imenika za shranjevanje ključavnice. Test, ki prvi pridobi ključavnico, se izvede, ostali testi morajo počakati na njegovo dokončanje.


Environment::bypassFinals() .[filter]
-------------------------------------
Razredi ali metode, označene kot `final`, se težko testirajo. Klic `Tester\Environment::bypassFinals()` na začetku testa povzroči, da se ključne besede `final` med nalaganjem kode izpustijo.

```php
require __DIR__ . '/bootstrap.php';

Tester\Environment::bypassFinals();

class MyClass extends NormallyFinalClass  # <-- NormallyFinalClass ni več final
{
	// ...
}
```


Environment::setup() .[filter]
------------------------------
- izboljša berljivost izpisa napak (vključno z barvanjem), sicer je izpisan privzeti PHP stack trace
- vklopi preverjanje, ali so bile v testu klicane asercije, sicer test brez asercij (na primer pozabljenih) prav tako uspe
- pri uporabi `--coverage` samodejno zažene zbiranje informacij o zagnani kodi (opisano naprej)
- izpiše stanje OK ali FAILURE na koncu skripta


Environment::setupFunctions() .[filter]{data-version:2.5}
---------------------------------------------------------
Ustvari globalne funkcije `test()`, `testException()`, `setUp()` in `tearDown()`, v katere lahko členite teste.

```php
test('opis testa', function () {
	Assert::same(123, foo());
	Assert::false(bar());
	// ...
});
```


Environment::VariableRunner .[filter]
-------------------------------------
Omogoča ugotoviti, ali je bil test zagnan neposredno ali s pomočjo Testerja.

```php
if (getenv(Tester\Environment::VariableRunner)) {
	# zagnano s Testerjem
} else {
	# zagnano drugače
}
```


Environment::VariableThread .[filter]
-------------------------------------
Tester zažene teste vzporedno v navedenem številu niti. Če nas zanima številka niti, jo ugotovimo iz spremenljivke okolja:

```php
echo "Tečem v niti številka " . getenv(Tester\Environment::VariableThread);
```

Pomožni razredi

DomQuery

Tester\DomQuery je razred, ki razširja SimpleXMLElement z enostavnim iskanjem v HTML ali XML s pomočjo CSS selektorjev.

# ustvarjanje DomQuery iz HTML niza
$dom = Tester\DomQuery::fromHtml('
	<article class="post">
		<h1>Naslov</h1>
		<div class="content">Besedilo</div>
	</article>
');

# test obstoja elementov s pomočjo CSS selektorjev
Assert::true($dom->has('article.post'));
Assert::true($dom->has('h1'));

# iskanje elementov kot polje DomQuery objektov
$headings = $dom->find('h1');
Assert::same('Naslov', (string) $headings[0]);

# test, ali element ustreza selektorju (od različice 2.5.3)
$content = $dom->find('.content')[0];
Assert::true($content->matches('div'));
Assert::false($content->matches('p'));

# iskanje najbližjega prednika, ki ustreza selektorju (od 2.5.5)
$article = $content->closest('.post');
Assert::true($article->matches('article'));

FileMock

Tester\FileMock emulira datoteke v pomnilniku in tako olajša testiranje kode, ki uporablja funkcije fopen(), file_get_contents(), parse_ini_file() in podobne. Primer uporabe:

# Testirani razred
class Logger
{
	public function __construct(
		private string $logFile,
	) {
	}

	public function log(string $message): void
	{
		file_put_contents($this->logFile, $message . "\n", FILE_APPEND);
	}
}

# Nova prazna datoteka
$file = Tester\FileMock::create('');

$logger = new Logger($file);
$logger->log('Prijava');
$logger->log('Odjava');

# Testiramo ustvarjeno vsebino
Assert::same("Prijava\nOdjava\n", file_get_contents($file));

Assert::with()

Ne gre za asercijo, ampak pomočnika za testiranje zasebnih metod in lastnosti objektov.

class Entity
{
	private $enabled;
	// ...
}

$ent = new Entity;

Assert::with($ent, function () {
	Assert::true($this->enabled); // dostopna zasebna $ent->enabled
});

Helpers::purge()

Metoda purge() ustvari navedeni imenik, in če že obstaja, izbriše celotno njegovo vsebino. Uporabno za ustvarjanje začasnega imenika. Na primer v tests/bootstrap.php:

@mkdir(__DIR__ . '/tmp');  # @ - imenik že lahko obstaja

define('TempDir', __DIR__ . '/tmp/' . getmypid());
Tester\Helpers::purge(TempDir);

Environment::lock()

Testi se izvajajo vzporedno. Včasih pa potrebujemo, da se izvajanje testov ne prekriva. Tipično pri podatkovnih testih je nujno, da si test pripravi vsebino podatkovne baze in da mu drug test med izvajanjem ne posega v podatkovno bazo. V teh testih uporabimo Tester\Environment::lock($name, $dir):

Tester\Environment::lock('database', __DIR__ . '/tmp');

Prvi parameter je ime ključavnice, drugi je pot do imenika za shranjevanje ključavnice. Test, ki prvi pridobi ključavnico, se izvede, ostali testi morajo počakati na njegovo dokončanje.

Environment::bypassFinals()

Razredi ali metode, označene kot final, se težko testirajo. Klic Tester\Environment::bypassFinals() na začetku testa povzroči, da se ključne besede final med nalaganjem kode izpustijo.

require __DIR__ . '/bootstrap.php';

Tester\Environment::bypassFinals();

class MyClass extends NormallyFinalClass  # <-- NormallyFinalClass ni več final
{
	// ...
}

Environment::setup()

  • izboljša berljivost izpisa napak (vključno z barvanjem), sicer je izpisan privzeti PHP stack trace
  • vklopi preverjanje, ali so bile v testu klicane asercije, sicer test brez asercij (na primer pozabljenih) prav tako uspe
  • pri uporabi --coverage samodejno zažene zbiranje informacij o zagnani kodi (opisano naprej)
  • izpiše stanje OK ali FAILURE na koncu skripta

Environment::setupFunctions()

Ustvari globalne funkcije test(), testException(), setUp() in tearDown(), v katere lahko členite teste.

test('opis testa', function () {
	Assert::same(123, foo());
	Assert::false(bar());
	// ...
});

Environment::VariableRunner

Omogoča ugotoviti, ali je bil test zagnan neposredno ali s pomočjo Testerja.

if (getenv(Tester\Environment::VariableRunner)) {
	# zagnano s Testerjem
} else {
	# zagnano drugače
}

Environment::VariableThread

Tester zažene teste vzporedno v navedenem številu niti. Če nas zanima številka niti, jo ugotovimo iz spremenljivke okolja:

echo "Tečem v niti številka " . getenv(Tester\Environment::VariableThread);