我有以下数据提供器方法: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