2015-08-09 17 views
10

Tôi đang thực sự chạy vào một bức tường gạch với điều này. Làm thế nào để bạn vượt qua giá trị lớp học giữa các bài kiểm tra trong phpunit?phpunit: Làm cách nào để chuyển giá trị giữa các lần kiểm tra?

thử nghiệm 1 -> bộ giá trị,

Test 2 -> đọc giá trị

Đây là mã của tôi:

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() không nhận được giá trị của $this->blockHash đó nên được đặt trong testCmdGetBlockHash().

Giúp hiểu những gì sai sẽ được đánh giá cao.

Trả lời

18

Phương pháp setUp() luôn được gọi trước khi kiểm tra, vì vậy ngay cả khi bạn thiết lập phụ thuộc giữa hai thử nghiệm, bất kỳ biến nào được đặt trong setUp() sẽ bị ghi đè. Cách dữ liệu PHPUnit đi qua công trình là từ giá trị trả về của một thử nghiệm để các tham số của người kia:

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); 
    } 
} 

Vì vậy, nếu bạn cần để tiết kiệm nước hơn giữa kiểm tra, trả lại dữ liệu hơn trong phương pháp đó. Tôi đoán rằng lý do PHPUnit làm cho điều này gây khó chịu là ngăn cản các bài kiểm tra phụ thuộc.

See the official documentation for details.

+0

Tuyệt vời! Cảm ơn bạn rất nhiều, tôi không có ý tưởng làm thế nào tôi đã không nhận về điều đó. – Drazisil

6

Bạn có thể sử dụng một biến tĩnh trong một hàm ... PHP annoyingly cổ phiếu biến tĩnh của phương pháp lớp học với tất cả các trường hợp ... Nhưng trong này cas nó có thể giúp: p

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 
} 

NB: đây không phải là cách tốt nhưng nó giúp nếu bạn cần một số dữ liệu trong tất cả các thử nghiệm của bạn ...

+0

Tôi rất ấn tượng với công việc này! –

+0

Rất hữu ích khi bạn cần hoặc đặt cấu hình cho tất cả các bài kiểm tra trong lớp học. Không có phương thức nào được gọi với ngữ cảnh phiên như * setUpPage * chỉ một lần trước tất cả các bài kiểm tra trong lớp. Em đúng không? –

+0

Atually tôi đã tìm thấy * public static function setUpBeforeClass() * nhưng cái này được gọi trước khi test class được khởi tạo. –

Các vấn đề liên quan