【发布时间】:2015-06-30 22:48:57
【问题描述】:
我正在使用 Rolify gem 来分配用户角色。它似乎成功地工作,我所有的测试都没有问题地通过。但是,有一个测试似乎不起作用。
Rolify 提议添加after_create,我已将其添加到我的用户模型中:
after_create :assign_mod_role
def assign_mod_role
self.add_role :moderator, self.organization
end
这会将版主角色分配给创建的每个用户(用户始终与组织关联)。这在开发中有效。我创建的集成测试:
test "user signup" do
log_in_as(@admin) #@admin of @organization1
assert_difference 'User.count' do
post adduser_path, user: { email: "ppppp@pppp.pp",
username: "pppppp",
password: "pppppp",
password_confirmation: "pppppp" }
end
testuser = assigns(:user)
assert_equal testuser.has_role?(:moderator, @organization1), true
end
但是最后一行失败了。 是我做错了什么还是无法测试 after_create 方法? 也许 Rolify 管理角色的方式不允许对此进行测试?
测试日志的最后三行:
[1m [36m (0.5ms) [0m [1mSELECT COUNT(*) FROM "users" [0m
[1m [35mRole Load (0.5ms) [0m SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND ((((roles.name = 'moderator') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)) OR ((roles.name = 'moderator') AND (roles.resource_type = 'Organization') AND (roles.resource_id IS NULL)) OR ((roles.name = 'moderator') AND (roles.resource_type = 'Organization') AND (roles.resource_id = 980190962)))) [["user_id", 1067176257]]
[1m [36m (0.5ms) [0m [1mROLLBACK [0m
【问题讨论】:
-
after_create是ActiveRecord::Callbacks 的一部分——它与 Rolify 没有任何关系。您应该使用带有极端偏见的模型回调。当他们被解雇时,通常很难控制,而且他们通常不适合测试。我会说这是你不应该使用回调的一种情况。而是在您的控制器中执行此操作。 -
将其移至控制器,然后确实通过了相同的测试。但是,在播种后,用户不再“自动”接收角色。我尝试将
User.where(username: 'myname').add_role :moderator, Organization.where(name: 'Business name')添加到种子文件中,但这会产生错误:undefined method 'add_role' for #<ActiveRecord::Relation []>。 -
在 .each 循环中执行。
-
但是现在,我只是想将版主角色添加到 1 个特定组织的 1 个用户。
-
使用 .find_by(username: 'myname') 或 .where(...).first 以便获得单个用户记录。
标签: ruby-on-rails ruby testing integration-testing rolify