我有一个模型User
,它使用after_save
回调更新全局角色(来自Rolify)。我正在尝试测试在更改全局角色时保留用户的Permission
(数据库视图)。目前,在更改全局角色时会重置所有角色。
在我修复之前,我试图使用change
匹配器获得失败的测试结果,但是这个测试正在通过。
it "preserves permissions when changing role" do
user = FactoryBot.create(:user, role: Role::ROLE_ADMIN)
project = FactoryBot.create(:project)
user.add_role :owner, project
user.role = Role::ROLE_EDITOR
expect { user.save; user.reload }.to_not change { user.permissions }
如果我按如下方式编写测试,它会失败(我想要的),但看起来很冗长。
it "preserves permissions when changing role" do
user = FactoryBot.create(:user, role: Role::ROLE_ADMIN)
project = FactoryBot.create(:project)
user.add_role :owner, project
permissions = Array.new user.permissions
user.role = Role::ROLE_EDITOR
user.save
user.reload
expect(user.permissions).to eq permissions
end
如何使用Rspec after_save
匹配器通过change
回调测试关联更改?
更改用户角色的模型方法如下。 sync_pending_role!
是在after_save
回调中运行的内容。
def role=(new_role)
@pending_role = new_role.to_s
end
def sync_pending_role!
return if pending_role.blank?
roles_to_remove = Role::ALLOWED_ROLES.without(pending_role.to_s)
roles_to_remove.each { |role| remove_role role }
add_role pending_role
end