我正在使用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
答案 0 :(得分:0)
after_create
是ActiveRecord::Callbacks的一部分 - 它与Rolify没有任何关系。您应该使用具有极端偏见的模型回调。当它们被解雇时通常很难控制,而且它们通常不适合测试。我会说这是一个你不应该使用回调的情况。改为在控制器中执行。
如果您创建对象的步骤多于一个好的解决方案,那就是在模型上使用服务对象或工厂方法来保持控制器的精益。