我有一个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
答案 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个问题:
为什么使用实例变量@obj
而不是局部变量obj
为什么只有更新1列的特殊方法。 update_column不适合你吗?