Ruby on rails 期望{subject}.to change(…)。by(1)不起作用
此测试通过:Ruby on rails 期望{subject}.to change(…)。by(1)不起作用,ruby-on-rails,rspec,Ruby On Rails,Rspec,此测试通过: it 'test' do old = parenthood.student.balance Payment.money_transfer_to_child current_user: parenthood.user, student_id: parenthood.student.id, amount: '1',
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) }
我做错了什么?在主题中添加一行解决了我的问题:
subject { Payment.money_transfer_to_child current_user: parenthood.user,
student_id: parenthood.student.id,
amount: '1',
comment: 'some comment'
parenthood.student.reload }
在主题中添加一行解决了我的问题:
subject { Payment.money_transfer_to_child current_user: parenthood.user,
student_id: parenthood.student.id,
amount: '1',
comment: 'some comment'
parenthood.student.reload }
我知道你想出了一个办法让它工作,但也许让我们在这里有一个正确的答案。首先,为什么它不起作用 它{expect{subject}.to changeparenthood.student.reload,:balance.by1} 当执行这一行时,所做的不是精确的,而是粗略的: 首先计算了变分法的参数。这意味着parenthood.student.reload将在该点进行计算。 对已计算的对象调用balance方法,并记住该值。 expect中的块在本例中仅执行subject 再次对对象调用balance方法 这里的问题是parenthood.student.reload是在执行主题之前进行评估的。在执行subject之后,不再计算它,因为它已经传递给change方法。这就是为什么你有旧的价值观 你可以做的是要么有你的解决方案,但它不是很优雅,因为重新加载父母身份不是你测试的一部分。或者,您可以在change matcher中使用块并执行以下操作:
it { expect{ subject }.to change { parenthood.student.reload.balance }.by(1) }
该语法使parenthood.student.reload.balance的块在运行主题之前和之后都进行了评估,应该可以修复您的测试。我知道您找到了一种方法使其工作,但也许我们在这里有一个正确的答案。首先,为什么它不起作用 它{expect{subject}.to changeparenthood.student.reload,:balance.by1} 当执行这一行时,所做的不是精确的,而是粗略的: 首先计算了变分法的参数。这意味着parenthood.student.reload将在该点进行计算。 对已计算的对象调用balance方法,并记住该值。 expect中的块在本例中仅执行subject 再次对对象调用balance方法 这里的问题是parenthood.student.reload是在执行主题之前进行评估的。在执行subject之后,不再计算它,因为它已经传递给change方法。这就是为什么你有旧的价值观 你可以做的是要么有你的解决方案,但它不是很优雅,因为重新加载父母身份不是你测试的一部分。或者,您可以在change matcher中使用块并执行以下操作:
it { expect{ subject }.to change { parenthood.student.reload.balance }.by(1) }
该语法使parenthood.student.reload.balance块在运行subject之前和之后都进行了评估,并且应该修复您的测试