将实例变量分配给工厂女孩创建的持久数据的行为

时间:2016-11-29 19:30:13

标签: ruby ruby-on-rails-4 rspec factory-bot instance-variables

我在其他地方看到过这种表示法:@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)。

对于为什么会出现这种情况的任何猜测?

1 个答案:

答案 0 :(得分:0)

解决方案是使用@video.reload.title来更新来自DB的记录。

创建@video时,它现在与数据库更改断开连接(视频对象中的静态副本)reload将使其从数据库中刷新自身,显示自初始分配以来所做的更改。

资源包括:

(感谢@SergiiK和@engineersmnky在上述评论中回答了这个问题。)