Jak smažeme virtuální soubor?

Polki
Člen | 553
+
0
-

Ahoj,
opět testy a nějak zlobí mazání souborů

Mám jednoduchý test:

$mockedfile = FileMock::create('Ahoj', 'txt');

Assert::true(file_exists($mockedfile), 'fileCreated');

FileSystem::delete($mockedfile);

Assert::false(file_exists($mockedfile), 'fileDeleted');

Spuštění spadne s chybou:

Failed: fileDeleted: TRUE should be FALSE in testSave()

Dělám něco někde špatně já, nebo je to bug?

Editoval Polki (22. 6. 2021 18:15)

David Matějka
Moderator | 6445
+
0
-

Teoreticky je to bug, jelikož ten stream wrapper vždy vrací konstantní file stat a mohl by vracet false, pokud byl ten soubor smazán z paměti, ale prakticky to není relevantní – ten soubor je jen v paměti a i kdyby si jej nesmazal ručně, tak po ukončení procesu nebude zabírat žádné zdroje.
nebo máš nějaký reálný případ, kde tě to trápí?

Polki
Člen | 553
+
0
-

To máš pravdu, že se smaže.

Nicméně já testuju funkci, která mi má smazat soubor z disku. No jenže cestu k tomu souboru si ta funkce generuje z parametrů a vrací true/false jestli se soubor/y povedlo nebo nepovedlo smazat. Ale nevrací tu vygenerovanou cestu a nechci modifikovat návratový typ jen kvůli testům.

Tak mě napadlo, že bych vytvořil soubor v paměti pod tou cestou, která se má vygenerovat a pak checknul, jestli se ten soubor smazal. Vytvářet soubor reálně ve složce jsem nechtěl, aby mi to zbytečně nezapisovalo na disk.

Chci jednoduše otestovat, že když do funkce pošlu parametr 123 a funkce vrátí true, tak že smazala opravdu správný soubor v cestě ‚%appDir%/aaa/bbb/ccc/file.txt‘ a ne nějaký jiný kvůli špatně generované cestě.
%appDir% samozřejmě nahrazuju pomocí virtuální cesty, takže by se měl soubor tvořit v paměti.

Nechci vořit soubory reálně na disku. Nebo myslíš, že tvořit je fyzicky na disku je lepší?

Editoval Polki (23. 6. 2021 0:27)

David Matějka
Moderator | 6445
+
+1
-

hm, on to mozna bude bug v php. pri file_exists to totiz vola url_stat, ktery bere v potaz, jestli to bylo smazane. Ale po smazani souboru se vubec nezavola

PHP totiz cachuje vysledek file_exists a v pripade stream wrapperu asi spatne invaliduje tu cache (u normalniho souboru to funguje spravne..)


edit: pomuze explicitni smazani cache: clearstatcache(false, $filename);. ale i tak to bude asi bug, jelikoz pisou, ze

However unlink() clears the cache automatically.

Polki
Člen | 553
+
0
-

Díky. Funguje.

Polki
Člen | 553
+
0
-

Je možnost někde tento bug nahlásit?