2014-09-22 65 views
0

我有一个名为queue_item的简单模型,它具有一个名为“list_order”的属性,它允许用户更改页面上项目外观的顺序。我有一个简单的rSpec测试,用于验证发布到控制器操作后“list_order”属性是否更改。我测试的不断失败,出现此错误消息:rSpec中定义的变量不变

QueueItemsController POST sort_list_order user is authenticated input is valid Assigns list_order 
Failure/Error: expect(item1.list_order).to eq(3) 

    expected: 3 
     got: 1 

这是很奇怪的我,因为当我把控制器动作binding.pry我的代码更改“list_order”的属性后,它显示了所有的queue_item对象已成功更新。此外,UI功能按预期工作。为什么rSpec测试不会反映控制器操作对对象的更改?

控制器动作:

def sort_list_order 
    counter = 1 
    array = params[:queue_items].sort_by{ |k,v| v } 
    array.each do |k,v| 
     item = QueueItem.find(k.to_i) 
     puts item.list_order 
     item.update(list_order:counter) 
     puts item.list_order 
     counter +=1 
    end 
    binding.pry 

测试:

it "Assigns list_order" do 
     item1 = Fabricate(:queue_item) 
     item2 = Fabricate(:queue_item) 
     item3 = Fabricate(:queue_item) 

     post :sort_list_order, queue_items:{item1.id=>3 ,item2.id =>2 ,item3.id => 1 } 

     expect(item1.list_order).to eq(3) 
     expect(item2.list_order).to eq(2) 
     expect(item3.list_order).to eq(1) 
    end 

回答

0

您需要重新从数据库中的对象,因为在内存中的对象中声明规范没有改变。

expect(item1.reload.list_order).to eq(3) 
    expect(item2.reload.list_order).to eq(2) 
    expect(item3.reload.list_order).to eq(1)