假设我有模型User
和Post
,一个用户拥有多篇文章(has_many
),一篇文章属于一个用户(belongs_to
)。
当我为Post
编写规范(spec)时,我的第一反应是编写类似以下内容:
before do
@user = FactoryGirl.create :user
@post = @user.posts.new(title: "Foo", content: "bar)
end
... tests for @post go here ...
但是这会为每个单独的测试创建一个新用户 - 并对数据库进行操作 - 这将减慢速度。有没有更好的方法可以加快我的测试速度,避免经常连接到数据库?
据我所知,我不能使用FactoryGirl.build :user
,因为即使它不会连接到数据库,关联也不会正常工作,因为@user
没有ID,所以@post.user
无法工作(返回 nil
)。
我可以使用FactoryGirl.build_stubbed :user
来创建“虚假持久化”的@user
,它确实具有ID,但@post.user
仍然返回 nil
。当我测试与关联相关的内容时,build_stubbed
是否比 build
更实用?
我想我可以使用build_stubbed
存根 @post.user
,以便它返回 @user
...这样做有什么不好的原因吗?
还是应该使用create
并接受速度降低?
我能想到的唯一其他选择是在before(:all)
块中设置 @user
,这似乎不是一个好主意。
以清晰、简洁的方式编写这些测试的最佳方法是什么,以避免进行过多的数据库查询?