PHPUnit mock paraméter decoding
Üdv!
PHPUnit-ban egy mock objektumnál a paraméter vizsgálatnál elakadtam, mivel base64 enkódolva van, a mock with() metódusában pedig ellenőrzés előtt dekódolni kellene, azonban nem tudom, ezt hogy lehet elérni.
Tehát a paramétert így adom át: base64_encode(json_encode($param))
base64_encode nélkül az alábbi kód tökéletesen működik:
■ PHPUnit-ban egy mock objektumnál a paraméter vizsgálatnál elakadtam, mivel base64 enkódolva van, a mock with() metódusában pedig ellenőrzés előtt dekódolni kellene, azonban nem tudom, ezt hogy lehet elérni.
Tehát a paramétert így adom át: base64_encode(json_encode($param))
base64_encode nélkül az alábbi kód tökéletesen működik:
$client = $this->getMock('GearmanClient', array('doBackground'));
$client
->expects($this->once())
->method('doBackground')
->with(
self::equalTo('methodname'),
self::logicalAnd(
self::stringContains('"kulcs1":"' . $v1 . '"'),
self::matchesRegularExpression('/"kulcs2":"[^,]+",/')
)
);
Hááát
Az első, hogy írsz egy saját Constraint class-t a PHPUnit-hoz, ami az igényeidhez igazodik. Nyiss meg egy Constraint class-t és bizonyosodj meg róla, hogy ezt nem akarod csinálni :)
A második valami ilyesmi:
Ez az élmélet, kívnácsi vagyok, beválik-e gyakorlatban, még sosem csináltam így :)
Köszi, holnap reggel ezzel
Működik :) Egyetlen
Egyetlen szépséghiba, hogy a callback metódusban fel szeretnék használni néhány változót, amiket a testcase-ben definiáltam. A returnCallback() azonban ezeket nem passzolja tovább, úgyhogy kénytelen voltam kirakni member változóba a tesztelendő értékeket (és azokat így már elérem a callback-ben).
Erre esetleg van jobb ötleted?
Egyébként teljesen igazad van, a PHPUnit oldalán pontosan ott van a példa, csak ott a visszatérési érték ellenőrzése végett használja ezt a megoldást, míg én az argumentumokat vizsgálom.
Extending
Sajnos a változók "megtartására" nincs túl jó módszer, a tulajdonságokba mentés kielégítő megoldás.
Opcinálisan kiterjesztheted a PHPUnitot, ami egyébként nem annyira javasolt, ha mondjuk a jövőben frissítenéd. Esetleg csinálj egy forkot róla és kérj egy merge request-et, szerintem ez a változás beleillik a képbe.
http://github.com/sebastianbergmann/phpunit/
Szóval a lényeg:
Megkeresed a PHPUnit_Framework_MockObject_Stub osztályt, és hozzáadsz egy új argumentumot a konstruktorhoz, amit később a callback hívásánál használsz az eredeti argumentumokkal együtt.