我在其他地方看到过这种表示法:@user = FactoryGirl.create(:user)
,但无法弄清楚这个实例变量的确切行为。
具体来说,我想知道这个实例变量的行为。例如,我目前正在RSpec中创建集成测试。在其中一个测试中,我尝试将实例变量分配给我的Video类的实例:
@video = FactoryGirl.create(:video, title: "Test title")
此时我没有遇到访问视频实例的不同属性的问题(例如,使用@video.title
))。
但是,我正在创建一个集成测试,以确保用户可以清除"标题"表单中的字段和视频更新时,标题将在数据库中删除。如,
click_link "Edit"
fill_in "Title", with: ""
click_button "Update Video"
expect(find('#title')).to_not have_content "Test title"
由于某种原因,页面显示正确,但是当我尝试使用实例变量访问实例时,没有发生任何更改:print @video.title
返回"Test title"
奇怪的是,在不同的集成测试中,我使用类似的过程来更新视频实例的属性(例如,更新为测试标题")。然后,我测试了网页中是否正确更新了属性,但是他们确实如此,但是这个时间实例变量也反映了这一点(使用print @video.title
)。
对于为什么会出现这种情况的任何猜测?
答案 0 :(得分:0)
解决方案是使用@video.reload.title
来更新来自DB的记录。
创建@video
时,它现在与数据库更改断开连接(视频对象中的静态副本)reload
将使其从数据库中刷新自身,显示自初始分配以来所做的更改。
资源包括:
(感谢@SergiiK和@engineersmnky在上述评论中回答了这个问题。)