2015-04-24 14 views
0

該測試通過:指望{}主題。要改變(...)(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) } 

我在做什麼錯?

回答

2

我看你想出一個辦法,使工作,但也許我們有一個正確的答案在這裏。所以首先它爲什麼不起作用。

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

在執行這條線是什麼做的是(不完全,但大致):改變方法的

  1. 首先參數進行計算。這意味着parenthood.student.reload在這一點上被評估。
  2. 在被評估的對象上調用平衡方法,並記住該值。
  3. 在預期(在這種情況下,僅被攝體)的塊執行
  4. 再次平衡方法被調用的對象

這裏的問題是在執行subject之前parenthood.student.reload評價上。在執行subject之後,它再也沒有被計算過,因爲已經通過了改變方法。這就是爲什麼你在那裏擁有舊的價值。

你可以做的是要麼有你的解決方案(但它不是很優雅,因爲重新加載父母身份不是你正在測試的一部分)。或者你可以使用在變化匹配塊,並完成類似:

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

這句法使得與parenthood.student.reload.balance塊評價都運行subject之前和之後,應解決您的測試。

0

添加一行到主題來解決我的問題:

subject { Payment.money_transfer_to_child current_user: parenthood.user, 
               student_id: parenthood.student.id, 
               amount: '1', 
               comment: 'some comment' 
       parenthood.student.reload }