Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 期望{subject}.to change(…)。by(1)不起作用_Ruby On Rails_Rspec - Fatal编程技术网

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之前和之后都进行了评估,并且应该修复您的测试