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