$GLOBAL
Closureλ 01aa34783c9b19d39e568641f3f2dd0fc983b11a & # 352 μ΄ν λ μ΄μ μ§λ ¬νλμ§ μμ§λ§ Closureλ₯Ό κ°μΌλ‘ ν¬ν¨νλ $GLOBAL
λ°°μ΄μ μ¬μ ν ββ" 'Closure'μ μ§λ ¬νκ° νμ©λμ§ μμ"μ€λ₯λ₯Ό λ°μμν΅λλ€.
$GLOBALS[] = array( 'foo' => function() { return 'bar'; } );
μ λ₯Ό ν¬ν¨ν λͺλͺ μ¬λλ€μ΄μ΄ λ¬Έμ λ₯Ό κ²ͺκ³ μλ κ² κ°μ΅λλ€. http://stackoverflow.com/questions/4366592/symfony-2-doctrine-2-phpunit-3-5-serialization-of-closure-exception
λ΄κ°λ°λ λ λ€λ₯Έ μ¬λ‘
/ * test.php * / ClosureTest ν΄λμ€λ PHPUnit_Framework_TestCaseλ₯Ό νμ₯ν©λλ€. { function testClosure () { $ this-> assertEquals (1, 1); call_user_func (function ($ a) { throw new \ Exception ( "test"); }, 10); $ this-> assertEquals (2, 2); } }
κ·Έλ° λ€μ νλ‘μΈμ€ 격리μμ μ€ν
phpunit --process-isolation test.php
λΉμ μ μ»μ κ²μ΄λ€
1 κ°μ μ€λ₯κ° μμ΅λλ€. 1) phTest :: testClosure PHPUnit_Framework_Exception : PHP μΉλͺ μ μ€λ₯ :-: 37μμ ''Closure 'μ§λ ¬νκ° νμ©λμ§ μμ΅λλ€'λΌλ λ©μμ§μ ν¨κ» ν¬μ°©λμ§ μμ μμΈ 'Exception' μ€ν μΆμ : # 0-(37) : μ§λ ¬ν (λ°°μ΄) # 1-(123) : __phpunit_run_isolated_test () # 2 {κΈ°λ³Έ} λμ Έμ§-λΌμΈ 37 μ€ν¨! ν μ€νΈ : 1, μ΄μ€ μ : 0, μ€λ₯ : 1.
νλ‘μΈμ€ 격리λ₯Ό μ¬μ©ν λ λμΌν λ¬Έμ κ° λ°μνμ΅λλ€.μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ testCaseμ __sleepμ μΆκ°νκ³ κ±°κΈ°μμ ν΄λ‘μ λ₯Ό μ 리νμ΅λλ€. λλ₯Ό μν΄ λλ ν μ€νΈ μΌμ΄μ€μ μμ±μ μ½κ°μ λͺ¨μλ₯Ό μ μ₯νκΈ° λλ¬Έμ κ·Έκ²μ μ λ§λ‘ λ΄ μλͺ»μ΄μμ΅λλ€. λκ΅°κ°μκ² λμμ΄λκΈ°λ₯Ό λ°λλλ€.
λλ κ°μ λ¬Έμ κ° μμΌλ©° μμ μΈκΈ ν @tmilos λ¬Έμ λ₯Ό 볡μ ν μ μμ΅λλ€. μ΄ ν°μΌμ΄ μ£½μλμ§ λͺ¨λ₯΄κ² μ§λ§μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€λ©΄ μ’μ κ² κ°μ΅λλ€. λλ κ·Έκ²μ΄ λ°λμ§νλ€λ©΄ ν 리νμ€νΈλ₯Ό κΈ°κΊΌμ΄ λ£μ κ²μ λλ€.
Pull μμ²μ νμ κ°μ¬ν©λλ€!
μ‘°κΈμ μκ³ μμ§λ§ νλμ νλ‘μ νΈμμ λ²μ΄λ¬μ΅λλ€. @tmilos μ μ£Όμ
/* test.php */
class closureTest extends PHPUnit_Framework_TestCase
{
function testClosure() {
call_user_func(function($a) {
throw new \Exception("test");
});
}
}
call_user_func
λμ μ 곡λ μΈμκ° μμ΅λλ€. μ§λ ¬ν μμΈλ PHPUnit_Framework_TestResult κ°μ²΄λ₯Ό μ§λ ¬ννλ €λ μλλ‘ μΈν΄ λ°μν©λλ€. μ΄ μ§λ ¬ν μλλ PHPUnit/Framework/Process/TestCaseMethod.tpl.dist
42 νμμ μ°Ύμ μ μμ΅λλ€. μ§λ ¬ν λ κ°μ²΄μ λ¬Έμ κ°λλ λΆλΆμ throw λ Exceptionμ μΆμ κ³μΈ΅ ꡬ쑰μμλ ν΄λ‘μ μ°Έμ‘°μ
λλ€.
[1] => Array
(
[function] => {closure}
[class] => Issue451Test
[type] => ->
[args] => Array
(
)
)
λ΄ μ§λ¬Έμ PHPUnitμ μ²μμΌλ‘ ν¨μΉνλ κ²μ΄κΈ° λλ¬Έμ ν΄λ‘μ λ₯Ό μ κ±°νκ±°λ κ·Έλ μ§ μμΌλ©΄ 무ν΄νλλ‘ μμ νλ κ²λ³΄λ€ λΆμ‘±ν©λλ€. ? μ΅μν μ΄λ€ μκ°μ΄λ μκ²¬μ΄ μμ΅λκΉ?
λν Regressions / GitHubμμ ν μ€νΈλ₯Ό μμ±νμ΅λλ€. μ΄κ²μ΄ νμ©λ©λκΉ?
@kunjalpopat , κ·νμ λ¬Έμ μ κ΄λ ¨νμ¬ κ°μ₯ λ¨Όμ νμΈν΄μΌ ν κ²μ μμΈμ λλ€. νλ‘μΈμ€ 격리 μ€μ μμΈκ° λ°μνλ©΄ "Serialization of Closure"λ©μμ§κ° νμ λ μ μμ΅λλ€. ν μ€νΈ μ½λλ₯Ό try / catchλ‘ λννκ³ λ¬Έμ κ° ν΄κ²°λλμ§ νμΈνμμμ€. λ¬Έμ κ° ν΄κ²°λλ©΄ λ¬Έμ μμμ μ°Ύμ λκΉμ§ try / catch λ²μλ₯Ό μ€μ΄λ κ²μ΄ μ’μ΅λλ€.
λ¬Έμ λ PHPUnit_Util_GlobalState::backupGlobals
.
if ($key != 'GLOBALS' &&
!in_array($key, $superGlobalArrays) &&
!in_array($key, $blacklist) &&
!$GLOBALS[$key] instanceof Closure) { // <-- this is the problem
self::$globals['GLOBALS'][$key] = serialize($GLOBALS[$key]);
}
PHPUnit_Util_GlobalState
μμ λμ°λ―Έλ₯Ό λ§λ€μμ΅λλ€.
public static function checkIfThereIsClosureInIt($arr) {
if ($arr instanceof Closure)
return true;
if (is_object($arr))
$arr = get_object_vars($arr);
if (is_array($arr))
foreach ($arr as $x)
if (PHPUnit_Util_GlobalState::checkIfThereIsClosureInIt($x))
return true;
return false;
}
backupGlobals
κΈ°λ₯μ μ½κ° λ³κ²½νμ΅λλ€.
foreach (array_keys($GLOBALS) as $key) {
if ($key != 'GLOBALS' &&
!in_array($key, $superGlobalArrays) &&
!in_array($key, $blacklist) &&
!PHPUnit_Util_GlobalState::checkIfThereIsClosureInIt($GLOBALS[$key])
// !$GLOBALS[$key] instanceof Closure
) {
self::$globals['GLOBALS'][$key] = serialize($GLOBALS[$key]);
}
}
μ΄ λ²μ μ΄ μλνλ κ² κ°μ΅λλ€ (λ μ΄μ μμΈλ₯Ό ν¬μ°©νμ§ λͺ»ν¨).
$ GLOBALSμ λν μ¬κ·μ΄λ―λ‘ CPUμ μΆκ° μ΄μ μ€ μ μμ΅λλ€.
stafrμ μ μ½λ μμ μ "Serialization of Closure"μμΈμ κ΄λ ¨νμ¬ λ°μν PHPunit λ¬Έμ λ₯Ό μμ νμ΅λλ€. κ°μ¬ν©λλ€!
new MyRestClient()
μμ±μμ $this->client = new \GuzzleHttp\Client();
λ₯Ό ν¬ν¨νλ new MyRestClient()
μΈμ€ν΄μ€ν ν λλ§λ€ λμΌν μ€λ₯ λ©μμ§κ° νμλ©λλ€. λ΄ ν΄λμ€μ μμ±μμμ $x=function(){};
λ₯Ό μ¬μ©ν΄ 보μμ λλ λ§μ°¬κ°μ§μ
λλ€. Guzzle ν΄λΌμ΄μΈνΈκ° λ΄λΆμ μΌλ‘ λΉμ·ν μΌμνλ κ² κ°μ΅λλ€. μ΄κ²μ phpunit ν
μ€νΈ λ΄μμ μΈμ€ν΄μ€ννλ κ²μ λΆκ°λ₯νκ² λ§λλλ€. λλ μ§κΈ λ무 μ¬νλ€ : sob :
λ΄ κ²½νμ μΆκ°νλ κ²λΏμ
λλ€. κΈ°λ³Έμ μΌλ‘ μ΅λͺ
ν¨μ λλ ν΄λμ€λ₯Ό ν
μ€νΈ ν΄λμ€ μμ±μΌλ‘ λ£μ λλ§λ€ phpunitμ Serialization of 'Closure' is not allowed
λλ Serialization of 'class<strong i="6">@anonymous</strong>' is not allowed
μ λμ§λλ€. λ°λΌμ μ΅λͺ
ν¨μ λλ ν΄λμ€λ₯Ό μ¬μ©ν΄μΌνλ κ²½μ° ν
μ€νΈ ν΄λμ€ μμ±μ΄ μλ μΌνμ± λ³μλ₯Ό νμΈνμμμ€.
κ°μ₯ μ μ©ν λκΈ
new MyRestClient()
μμ±μμ$this->client = new \GuzzleHttp\Client();
λ₯Ό ν¬ν¨νλnew MyRestClient()
μΈμ€ν΄μ€ν ν λλ§λ€ λμΌν μ€λ₯ λ©μμ§κ° νμλ©λλ€. λ΄ ν΄λμ€μ μμ±μμμ$x=function(){};
λ₯Ό μ¬μ©ν΄ 보μμ λλ λ§μ°¬κ°μ§μ λλ€. Guzzle ν΄λΌμ΄μΈνΈκ° λ΄λΆμ μΌλ‘ λΉμ·ν μΌμνλ κ² κ°μ΅λλ€. μ΄κ²μ phpunit ν μ€νΈ λ΄μμ μΈμ€ν΄μ€ννλ κ²μ λΆκ°λ₯νκ² λ§λλλ€. λλ μ§κΈ λ무 μ¬νλ€ : sob :