Jak smažeme virtuální soubor?
- Polki
- Člen | 553
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
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
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
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.