gpt4 book ai didi

ruby-on-rails - 使用 FactoryGirl 加速模型规范中的关联 - create vs build vs build_stubbed

转载 作者:行者123 更新时间:2023-12-04 04:43:55 25 4
gpt4 key购买 nike

说我有模型 UserPost , 一个用户 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仍然返回零。是否 build_stubbedbuild 有任何实际优势当我测试与关联相关的事情时?

我想我可以使用 build_stubbed stub @post.user所以它返回 @user ......有什么理由这可能是个坏主意吗?

或者我应该只使用 create并接受速度打击?

我能想到的唯一其他选择是在 before(:all) 中设置 @user阻止这似乎是一个坏主意。

以干净、简洁的方式编写此类测试以避免进行过多的数据库查询的最佳方法是什么?

最佳答案

如果您不希望您的测试访问数据库,这就是您必须做的。

before do
@user = FactoryGirl.build_stubbed :user
@post = FactoryGirl.build_stubbed :post
@user.stub(:posts).and_return([@post])
@post.stub(:user).and_return(@user)
end

注意:使用 before(:all) 时要小心.它不会在事务中执行。因此,无论您在 before(:all) 中创建什么|会留在数据库中,并可能与其他测试发生冲突

关于 FactoryGirl.build ,它构建对象,但创建关联。

例如:
factory :user do
association posts
end

FactoryGirl.build(:user) #this creates posts in the database even though you are only building the parent object(user)

关于ruby-on-rails - 使用 FactoryGirl 加速模型规范中的关联 - create vs build vs build_stubbed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20663369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com