Phpunit: 'Closure'의 μ§λ ¬ν™”λŠ” ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2012λ…„ 01μ›” 02일  Β·  12μ½”λ©˜νŠΈ  Β·  좜처: sebastianbergmann/phpunit

$GLOBAL ClosureλŠ” 01aa34783c9b19d39e568641f3f2dd0fc983b11a & # 352 이후 더 이상 μ§λ ¬ν™”λ˜μ§€ μ•Šμ§€λ§Œ Closureλ₯Ό κ°’μœΌλ‘œ ν¬ν•¨ν•˜λŠ” $GLOBAL 배열은 μ—¬μ „νžˆ ​​" 'Closure'의 직렬화가 ν—ˆμš©λ˜μ§€ μ•ŠμŒ"였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

$GLOBALS[] = array( 'foo' => function() { return 'bar'; }  );
typbug

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

new MyRestClient() μƒμ„±μžμ— $this->client = new \GuzzleHttp\Client(); λ₯Ό ν¬ν•¨ν•˜λŠ” new MyRestClient() μΈμŠ€ν„΄μŠ€ν™” ν•  λ•Œλ§ˆλ‹€ λ™μΌν•œ 였λ₯˜ λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€. λ‚΄ 클래슀의 μƒμ„±μžμ—μ„œ $x=function(){}; λ₯Ό μ‚¬μš©ν•΄ λ³΄μ•˜μ„ λ•Œλ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. Guzzle ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‚΄λΆ€μ μœΌλ‘œ λΉ„μŠ·ν•œ μΌμ„ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 이것은 phpunit ν…ŒμŠ€νŠΈ λ‚΄μ—μ„œ μΈμŠ€ν„΄μŠ€ν™”ν•˜λŠ” 것을 λΆˆκ°€λŠ₯ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€. λ‚˜λŠ” μ§€κΈˆ λ„ˆλ¬΄ μŠ¬ν”„λ‹€ : sob :

λͺ¨λ“  12 λŒ“κΈ€

μ €λ₯Ό ν¬ν•¨ν•œ λͺ‡λͺ‡ μ‚¬λžŒλ“€μ΄μ΄ 문제λ₯Ό κ²ͺκ³ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 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 을 λ˜μ§‘λ‹ˆλ‹€. λ”°λΌμ„œ 읡λͺ… ν•¨μˆ˜ λ˜λŠ” 클래슀λ₯Ό μ‚¬μš©ν•΄μ•Όν•˜λŠ” 경우 ν…ŒμŠ€νŠΈ 클래슀 속성이 μ•„λ‹Œ μΌνšŒμ„± λ³€μˆ˜λ₯Ό ν™•μΈν•˜μ‹­μ‹œμ˜€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰