【发布时间】:2013-12-18 16:28:47
【问题描述】:
假设我有模型User 和Post,一个用户has_many 帖子和一个帖子belongs_to 一个用户。
当我为Post 编写规范时,我的第一反应是这样写:
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,这似乎是个坏主意。
以简洁明了的方式编写此类测试以避免进行过多的数据库查询的最佳方法是什么?
【问题讨论】:
标签: ruby-on-rails unit-testing rspec factory-bot