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

Behavior of assigning instance variable to persistent data that factory girl creates

我在其他地方看到过这种表示法:@user = FactoryGirl.create(:user),但无法弄清楚这个实例变量的行为方式。

具体来说,我想知道这个实例变量的行为。例如,我目前正在 RSpec 中创建集成测试。在其中一个测试中,我试图将一个实例变量分配给我的视频实例 class:

@video = FactoryGirl.create(:video, title: "Test title")

此时我可以轻松访问视频实例的不同属性(例如,使用 @video.title)。

但是,我正在创建一个集成测试,以确保用户可以清除表单中的 "title" 字段,并且当视频更新时,标题会在数据库中被删除。例如,

click_link "Edit"
fill_in "Title", with: ""
click_button "Update Video"
expect(find('#title')).to_not have_content "Test title"

由于某种原因,页面显示正确,但是当我尝试使用实例变量访问实例时,没有发生任何变化:print @video.title returns "Test title"

奇怪的是,在不同的集成测试中,我使用类似的过程来更新视频实例的属性(例如,"Updated Test title")。然后我测试了网页中的属性是否正确更新,他们确实更新了,但这次实例变量也反映了这一点(使用 print @video.title)。

猜猜为什么会这样?

解决方案是使用 @video.reload.title,从数据库更新记录。

当您创建 @video 它现在与数据库断开连接更改(视频对象中的静态副本)reload 将导致它从数据库中自行刷新,显示自其初始以来所做的更改作业。

资源包括:

(致谢@SergiiK 和@engineersmnky,他们在上述评论中回答了问题。)