Accessing private PHP class members without reflection
Privát tulajdonságokhoz való hozzáférés ReflectionClass nélkül, akár referenciával is
■ H | K | Sze | Cs | P | Szo | V |
---|---|---|---|---|---|---|
28 | 29 | 30 | 31 | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 1 |
Deeee..
Normál esetben nem
Ott sem szabadna elerni
Ezt sokan mondják, miközben
A teszttel nem a belso
Ha nagyon kellene valami privatot tesztelni, ott lehet egy masik osztaly stb bujik meg es jobb kiemelni es kulon tesztelni.
Ezt sokat hallani. Ehhez
Ha valóban csak a felületet tesztelnéd, akkor a függvényed teljes értelmezési tartományát bejárnád, az összes paramétered összes kombinációját végigpróbálva. Gyanítom, hogy te sem így csinálod.
akit eddig láttam az
A viccet félretéve azt tudod, hogy az adott implementáció milyen inputra milyen outputot kell adjon. Ehhez semmit nem kell tudni a belső működéséről. És butaság is a tesztet bármilyen belső működéshez, változóhoz stb kötni. Csak a refaktor költségét növelik, és ha a teszt nem tudja ezt nélkülözni, akkor az inkább valami tervezési hibára utal.
Én egyetértek vbencével és blacksonic-kal. Soha nem csináltam ilyet és nem is szeretnék.
Tehát hogyha például a
De, de miért kéne ehhez
Nyilván ahhoz, hogy letesztelj valamit, ismerned kell az elvárt funkcionalitást. De senki nem ezt vonta kétségbe, hanem azt, hogy ehhez belső változókat kell elérni. Amikor manuálisan tesztelsz egy rendszert, akkor sem debuggerrel nézed, hogy mik a különböző változók értékei. Az eredményre vagy kíváncsi, amit a végén kiköp pl egy clickre.
Pusztán logikailag
A debugolást, meg a
De, de miért kéne ehhez
Arra akarok kilyukadni, hogy a tesztjeid írásakor az implementáció ismeretére támaszkodsz, mert a tesztjeid lényege, hogy megerősítsd magad abban a hitedben, hogy amit leírtál, az úgy működik, ahogy gondolod (ezért fogsz néhány tudatosan kiválasztott paraméterkombinációt kipróbálni, amivel minden vezérlési utat bejársz), nem pedig az, hogy a specifikáció ismeretében validáld az implementációt (ebben az esetben minden paraméterkombinációt ki kellene próbálj).
Ha ebben megállapodtunk, akkor innentől hibás érv a privát változók vizsgálata ellen, hogy az implementációs részlet, mert az optimalizálás is az, és egy refaktorálás esetén ugyanúgy kell mindkét esetben a kód után igazítani a tesztet (csak míg ha felszámolsz egy változót, akkor el fog törni a teszt, addig ha mondjuk nagyobb tartományra kezdesz cache-elni, a tesztjeid szép csendben nem fogják lefedni azt az ágat).
Annyit kell tudnod a belso
Tobbi esetben szerintem nem kell tudnod belso mukodesrol.
function f(i) {
De ez tipikusan dependency
Attól függ, hogy az éles
Ez a baj ezzel a megközelítésével a unit tesztelésnek. Gondolj bele, mi is történik itt: csak azért, hogy elmondhassam, hogy én nem foglalkozom az implementációval – mert akkor a refaktoráláskor követnem kell a tesztjeimmel – az implementáció egy részét a kiemeléssel a specifikáció részévé teszem – és innentől egy refaktoráláskor még több munkám lesz a tesztek hozzáigazításával. Nyerni nem nyertem semmit, viszont ennyivel is komplexebbé tettem az interfészem.
Véleményem szerint a tesztelésnek, hibakeresésnek nem volna szabad befolyással lennie az architektúrára. Azt nem mondom, hogy az elérhető eszközök ezt minden esetben lehetővé teszik ma, de a mostani megközelítés mellett nincs is különösebb nyomás az ilyen irányú innováción.
Tegyük fel
Én elég gyakran belefutok ilyenbe. Nem én döntöm el, milyen keretrendszert használunk, így az a lehetőség, hogymást használok kilőve. Sőt, jelenleg egy ismert keretrendszerre épülő licenszelt e-commerce szörnyetegbe kell új dolgokat fejleszteni. Vagyis se a keretrendszert, se a szörnyeteget nem módosíthatjuk, csak a saját kiterjesztéseinket babrálhatjuk.
Vagyis én a munkám során kétlehetőség közül választhatok:
1. szétbarmolom a keretrendszert és a szörnyeteget mindenféle öröklésekkel és kiterjesztésekkel, bevezetve egy sor fölösleges getter/setter funkciót (magyarán elérhetővé téve a rejtett tulajdonságokat), hogy egyszerű legyen tesztet írni.
2. a fenti módszerrel simán felülvágom azt a nyamvadt változót, hogy a funkcióm tesztelésére tudjak fókuszálni anélkül, hogy a komplett rendszert be kellene izzítani hozzá.
Bár szinte bizonyos, hogy most sokan nyomtak egy facepalmot, és elkönyveltek Zs-kategóriás web-kontárnak, de én akkor is a 2. megoldást választom.
Miért nem hagyod ott a céget?
Dehogy hagyom itt
De ha ezt csak azért mondtad, mert esetleg szerinted csak az a jó munkahely, ahol a fejlesztés a legüberkúlabb trendekhez igazodik, hogy habosra verhesse a brét, hogy milyen istenkirályos megmondóemberes piacvezetős... És emiatt nem nyúl a privát dolgokhoz, mert hogy azt nem szabad? Az ilyen hozzáállás annyira piti már...
Itt errefelé ez a rákot se érdekli. Az ilyesmi nem mércéje a minőségnek. Ha jó, hasznos és működik, akkor nem vetjük el azért, mert valami divatos hiszti miatt boszorkányságnak lett kikiáltva.
És nekem személyszerint nagyon tetszik a fenti megoldás, itt elfogadják az ilyet, nem démonizálnak bele nem létező problémákat.
Te fogalmaztál így:jelenleg
Nem probléma
Nem minden feltétlenül rossz, ami szörnyeteg. Szörnyeteg, mert néhol túlbonyolított azért, hogy általánosan megfeleljen a legtöbb e-commerce követelménynek. Sok esetben nekünk nem kell belőle minden, nem a mi cégünkre lett kihegyezve. Szörnyeteg, mert PHP 5.1-re íródott, így akadnak néha javítani való dolgok. Szörnyeteg, mert sok helyen nincs dokumentáció. Szörnyeteg, mert csúnyán bele kell mock-olni a unit tesztek során. De ettől még tökéletesen jó arra a célra, amire a cégünk használja.
Olyan, mint egy 1971 Dodge Charger. Nem új, nem kicsi, nem optimalizált, de ha fel kell tépni az aszfaltot, arra tökéletesen alkalmas :D
És örülök, hogy nem a trendiség hajt, ezért is indult a mondat feltételes móddal :P
Azért az elhangzott érvelések
Nekem azért a fenti
Már sok ilyen vitát láttam,
Mindkét oldalnak vannak jó