gpt4 book ai didi

ruby-on-rails - 使用 Rspec on Rails 在回调中测试关联对象的创建

转载 作者:行者123 更新时间:2023-12-04 05:45:39 28 4
gpt4 key购买 nike

试图将我的头脑围绕 rspec 和适当的测试,并且很难正确地执行以下操作

假设我们有三个类

Class User
belongs_to :company
has_and_belongs_to_many :roles
end

Class Company
has_many :users
end

Class Role
has_and_belongs_to_many :users
end

在 User 类中,我有 before_create 回调分配用户默认的“company_admin”角色,如果用户是第一个与公司关联的用户
def check_for_initial_company_admin_role
if self.company.users.count == 0
self.roles << Role.find_by_name("company_admin")
end
end

如果他是与公司关联的第一个用户,如何在我的模型规范中正确测试用户被分配了“company_admin”角色?

更新
工作解决方案
describe "#check_for_initial_company_admin_role" do
it "sets the first user created to be the administrator" do
Factory(:role)
user = Factory(:user)

user.roles.count.should be > 0
user.roles.should include Role.find_by_name("company_admin")
end
end


Factory.define :user do |f|
f.email { Factory.next(:email) }
f.password "secret"
f.password_confirmation "secret"
f.association :company
end

Factory.define :role do |f|
f.name "company_admin"
end

Factory.define :company do |f|
f.name "foobar"
f.vat_id "1234"
end

最佳答案

我会这样处理它:

describe "#check_for_initial_company_admin_role" do
it "sets the first user created to be the administrator" do
company = Factory(:company)
user = Factory(:user)
company.users << user


user.roles.count.should > 0
user.roles.should include Role.find_by_name("company_admin")
end
end

这里可能不正确的假设是您在测试框架中使用了 Factory Girl。如果不是,那并不会真正改变这个测试的“内容”……只是你创建公司和用户的第一行。

您还可以选择从公司方面检查用户,但老实说,这感觉就像一个完全不同的测试——测试这些模型之间的关联。

我会采取的方法是,由于这实际上是一个模型测试,您需要创建和更改真实的模型对象,而不是模拟这些对象。如果这是一个 Controller 测试,我会模拟模型并积极地 stub 模型。

我希望这有助于并解决您的问题。如果没有,请告诉我我在哪里,我会再做一遍:) 我只有大约一年的时间进入 rspec,但我发现一旦我开始思考如何测试模型与模型。 Controller 我已经爱上它了。

关于ruby-on-rails - 使用 Rspec on Rails 在回调中测试关联对象的创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7901662/

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