我有以下數據提供器方法:PHPUnit似乎通過引用而不是通過複製傳遞變量?
public function delta_and_account_provider()
{
$defaultAccount = json_decode(FileHelper::getJson('account.json'));
return [
"acceptable negative adjustment" =>
[ -20, $defaultAccount],
"acceptable positive adjustment" =>
[ 20, $defaultAccount]
];
}
與測試:
/**
* @test
* @dataProvider delta_and_account_provider
*/
public function adjustments_modify_balance_correctly($delta, $account)
{
$originalBalance = $account->balance;
$expectedBalance = $originalBalance + $delta;
$actualObject = $this->applyAdjustmentToAccount($delta,$account);
$this->assertEquals($expectedBalance, $actualObject->balance);
}
的defaultAccount
具有100的平衡,以及在所述第二數據集中的斷言失敗 - 餘量爲100,而不是
這意味着將變量defaultAccount
作爲參考而不是複製到測試的第二次運行(在第二個數據集中)。因爲在第一次運行中,我從100減去20,將defaultAccount保留在80,然後在第二次測試運行期間,它將80加上20,結果保留爲100,而不是120.
測試通過if我更改了數據提供程序爲以下內容:
public function delta_and_account_provider()
{
$defaultAccount = json_decode(FileHelper::getJson('account.json'));
$defaultAccount2 = json_decode(FileHelper::getJson('account.json'));
return [
"acceptable negative adjustment" =>
[ -20, $defaultAccount],
"acceptable positive adjustment" =>
[ 20, $defaultAccount2]
];
}
的例子是有點做作,但我想打,我會期待第二次測試運行使用「乾淨」 $ defaultAccount變量來看,由提供dataprovider而不是之前測試運行的修改過的。
有人可以確認這件事發生在他們身上嗎?或者發生了什麼?
我使用PHP 7.1和5.4的PHPUnit
'$ defaultField'範圍內沒有這樣的變量。 – shudder
json_decode默認會創建一個stdObject。對象默認通過引用傳遞。你有沒有嘗試將json_decode()的第二個參數設置爲true使其成爲一個數組?顯然你必須更新測試,以使用數組符號而不是對象符號 – dbrumann
@ shudder,對不起,我有一個錯字,現在修復 - 謝謝指出! – Pitt