gpt4 book ai didi

ruby-on-rails - expect{ subject }.to change(...).by(1) 不起作用

转载 作者:行者123 更新时间:2023-12-05 02:22:19 24 4
gpt4 key购买 nike

此测试通过:

it 'test' do
old = parenthood.student.balance
Payment.money_transfer_to_child current_user: parenthood.user,
student_id: parenthood.student.id,
amount: '1',
comment: 'some comment'
expect(parenthood.student.reload.balance).to eq(old+1)
end

将其更改为以下形式使其不通过(“被 0 更改”):

subject { Payment.money_transfer_to_child current_user: parenthood.user,
student_id: parenthood.student.id,
amount: '1',
comment: 'some comment' }
it { expect{ subject }.to change(parenthood.student.reload, :balance).by(1) }

我做错了什么?

最佳答案

我看到您找到了让它工作的方法,但也许让我们在这里找到一个合适的答案。那么首先为什么它不起作用。

它 { expect{ subject }.to change(parenthood.student.reload, :balance).by(1)

当这一行被执行时,完成的是(不完全但粗略):

  1. 首先计算更改方法的参数。这意味着 parenthood.student.reload 会在此时进行评估。
  2. 在被评估的对象上调用 balance 方法,并记住该值。
  3. 执行 expect 中的 block (在本例中只有主题)
  4. 再次在对象上调用 balance 方法

这里的问题是 parenthood.student.reload 在执行 subject 之前被评估。在 subject 执行后,它再也不会被计算,因为它已经传递给 change 方法。这就是为什么您在那里拥有旧值的原因。

您可以做的是找到您的解决方案(但这不是很优雅,因为重新加载 parent 身份不是您正在测试的内容的一部分)。或者您可以使用更改匹配器中的 block 并执行以下操作:

it { expect{ subject }.to change { parenthood.student.reload.balance }.by(1) }

该语法使带有 parenthood.student.reload.balance 的 block 在运行 subject 之前和之后进行评估,并且应该修复您的测试。

关于ruby-on-rails - expect{ subject }.to change(...).by(1) 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29848883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com