Rspec测试与变更匹配器的关联

时间:2018-03-08 21:49:58

标签: ruby-on-rails activerecord rspec

我有一个模型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

0 个答案:

没有答案