Phpunit: Как передать значения между тестами?

Я действительно бегу в кирпичную стену с этим. Как вы передаете значения классов между тестами в 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() всегда вызывается перед тестами, поэтому даже если вы установите зависимость между двумя тестами, любые переменные, установленные в setUp() будут перезаписаны. Способ передачи данных PHPUnit работает от значения, возвращаемого одним тестом, до параметра другого:

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

Поэтому, если вам нужно сохранить больше состояний между тестами, верните больше данных в этом методе. Я предполагаю, что причина, по которой PHPUnit делает это раздражающим, состоит в том, чтобы препятствовать зависимым тестам.

Смотрите официальную документацию для деталей.

Ответ 2

Вы можете использовать статическую переменную внутри функции... PHP досадно разделяет статические переменные методов класса со всеми экземплярами... Но в этом случае он может помочь: 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: это НЕ хороший способ, но он помогает, если вам нужны данные во всех ваших тестах...

Ответ 3

Для меня это прекрасно работало во всех тестах: $this-> varablename

class SignupTest extends TestCase
{
    private $testemail = "[email protected]";
    private $testpassword = "Mypassword";
    public $testcustomerid = 123;
    private $testcountrycode = "+1";
    private $testphone = "5005550000";

    public function setUp(): void
    {
        parent::setUp();
    }

    public function tearDown(): void 
    {
        parent::tearDown();
    }

    public function testSignup()
    {
        $this->assertEquals("5005550000", $this->testphone;
    }
}