数据库记录在Rails测试函数中没有保存/持久存储?

时间:2015-08-30 03:17:44

标签: ruby-on-rails minitest persistent

我有一个update - 类型的方法,我试图使用MiniTest和FactoryGirl在Rails中测试。我的问题是虽然我可以看到更新 正确地更新函数中发生,但它似乎没有正确地重新进入测试功能。< / p>

这些是我们正在使用的对象,(obj被赋予默认location以开始:

location1 = create :location
location2 = create :location
obj = create :object, location: location1

然后我们调用update函数,该函数需要id

obj.update_location(obj.id, location2.id)

update功能:

def update_location(obj_id, loc_id)
    @obj = Object.find(obj_id)
    @obj.location_id = loc_id
    @obj.save
end

但是,当我回到测试文件中时,我会尝试assert更改...

assert_equal obj.location_id, location2.id

......我失败了。控制台告诉我obj.location_id仍然等于location1.id!这是为什么?

似乎@obj.save 正常工作,因为我在更新功能中插入puts @obj.inspect并输出正确更新的location_id

我不认为它与事务回滚有关,因为这一切都发生在一次测试中。 (而且我的印象是事务回滚只发生在测试之间)。

总之,我的问题是:为什么我的更新不会再次保留在导轨MiniTest test功能中?

编辑:这是整个测试:

test "update_location" do    
    location1 = create :location
    location2 = create :location

    #give the obj a starting `type`
    obj = create :obj, location: location1

    obj.update_location(obj.id, location2.id)   
    assert_equal obj.location_id, location2.id    
end

2 个答案:

答案 0 :(得分:2)

问题已解决,这是我的理解:

问题在于如何使用rails&#39; ORM工作。原始对象&#39; obj&#39;在创建数据时,数据库中会加载数据...但以后对数据库的更改不会自动存储到obj。我原以为obj.some_attribute查看数据库中的记录obj以便找到属性值 - 但实际上我认为属性只是在创建时加载到变量和数据库中如果我稍后致电obj.some_attribute,则无法访问。

通常,当通过变量本身完成更新时,Rails知道为您更新变量。所以当你写obj.some_attribute = 5,然后写obj.some_attribute时,Rails知道该值应该是5.但是Rails魔法在这种情况下不会发生,因为它是不通过变量更新记录。

所以需要做的只是reload来自数据库的对象。

所以assert_equal obj.reload.location_id, location2.id有效!

答案 1 :(得分:0)

可能有助于您找到答案的2个问题:

  1. 为什么使用实例变量@obj而不是局部变量obj

  2. 为什么只有更新1列的特殊方法。 update_column不适合你吗?