>

저는 이것으로 벽돌 벽에 닿습니다. PHPUnit의 테스트 사이에 클래스 값을 어떻게 전달합니까?

테스트 1->값을 설정

테스트 2->값을 읽습니다

내 코드는 다음과 같습니다 :

class JsonRpcBitcoinTest extends PHPUnit_Framework_TestCase
{
    public function setUp(){
        global $configRpcUser, $configRpcPass, $configRpcHost, $configRpcPort;
        $this->bitcoindConn = new JsonRpcBitcoin($configRpcUser, $configRpcPass, $configRpcHost, $configRpcPort);
        $this->blockHash = '';
    }
    /**
    * @depends testCanAuthenticateToBitcoindWithGoodCred
    */
    public function testCmdGetBlockHash()
    {   
        $result = (array)json_decode($this->bitcoindConn->getblockhash(20));
        $this->blockHash = $result['result'];
        $this->assertNotNull($result['result']);
    }
    /**
    * @depends testCmdGetBlockHash
    */
    public function testCmdGetBlock()
    {   
        $result = (array)json_decode($this->bitcoindConn->getblock($this->blockHash));
        $this->assertEquals($result['error'], $this->blockHash);
    }
}

testCmdGetBlock()   $this->blockHash 의 가치를 얻지 못한다  그것은 testCmdGetBlockHash() 에 설정되어야합니다 .

잘못된 것을 이해하는 데 큰 도움이 될 것입니다.

  • 답변 # 1

    와이즈 비즈  메소드는 항상 테스트 전에 호출되므로 두 테스트 사이에 종속성을 설정하더라도 setUp() 에 설정된 변수  덮어 씁니다. PHPUnit 데이터 전달 작동 방식은 한 테스트의 반환 값에서 다른 테스트의 매개 변수로입니다.

    setUp()
    
    

    따라서 테스트간에 더 많은 상태를 저장해야하는 경우 해당 방법으로 더 많은 데이터를 반환하십시오. PHPUnit이 이런 성가신 이유는 의존성 테스트를 삼가는 것입니다.

    자세한 내용은 공식 문서를 참조하십시오.

  • 답변 # 2

    함수 내에서 정적 변수를 사용할 수 있습니다 ... PHP는 모든 인스턴스와 클래스 메소드의 정적 변수를 성가 시게 공유합니다 ...하지만이 CAS에서는 도움이 될 수 있습니다 : p

    class JsonRpcBitcoinTest extends PHPUnit_Framework_TestCase
    {
        public function setUp()
        {
            global $configRpcUser, $configRpcPass, $configRpcHost, $configRpcPort;
            $this->bitcoindConn = new JsonRpcBitcoin($configRpcUser, $configRpcPass, $configRpcHost, $configRpcPort);
            $this->blockHash = '';
        }
    
        public function testCmdGetBlockHash()
        {   
            $result = (array)json_decode($this->bitcoindConn->getblockhash(20));
            $this->assertNotNull($result['result']);
            return $result['result']; // the block hash
        }
    
        /**
         * @depends testCmdGetBlockHash
         */
        public function testCmdGetBlock($blockHash) // return value from above method
        {   
            $result = (array)json_decode($this->bitcoindConn->getblock($blockHash));
            $this->assertEquals($result['error'], $blockHash);
        }
    }
    
    

    NB : 이것은 좋은 방법은 아니지만 모든 테스트에서 데이터가 필요한 경우 도움이됩니다 ...

    protected function &getSharedVar() { static $value = null; return $value; } ... public function testTest1() { $value = &$this->getSharedVar(); $value = 'Hello Test 2'; } public function testTest2() { $value = &$this->getSharedVar(); // $value should be ok }

관련 자료

  • 이전 geolocation - UBER과 같은 안드로이드에서 자동차의 지속적인 실제 추적을 수행하는 방법은 무엇입니까?
  • 다음 Angular Material/Angular Flex Layout에서 public-apits를 사용하는 것은 무엇입니까?