ruby-on-rails - 抽象出常见的 rspec 功能

标签 ruby-on-rails ruby rspec pundit

在我们的大量 Controller 测试中,我们必须像这样去除 pundit 策略功能:

policy = double("policy", :show? => true)
allow(UserPolicy).to receive(:new).and_return(policy)

我的目标是以类似 allow_policy(UserPolicy).to(:show?) 的方式结束,这样读起来更容易。

为了实现这一点,我编写了这个小模块,并将其包含在我的规范中。

module PolicyFaker
  def allow_policy(policy)
    fake_policy = FakedPolicy.new
    fake_policy.policy = policy
    fake_policy
  end

  class FakedPolicy
    attr_accessor :policy

    def to(action)
      policy = double("policy", action => true)
      allow(policy).to receive(:new).and_return(policy)
    end

    def not_to(action)
      policy = double("policy", action => false)
      allow(policy).to receive(:new).and_return(policy)
    end

    def to_not(action)
      not_to(action)
    end
  end
end

不幸的是,您不能在 describe block 之外使用 doubleallow,因此该模块不起作用。

我怎样才能完成类似的事情?

最佳答案

您是否通过 rspec configure 添加了模块? ?

RSpec.configure do |c|
  c.include PolicyFaker
end

如果我没记错的话,allow_policy 将可用并且属性范围内,如果你这样做的话。

关于ruby-on-rails - 抽象出常见的 rspec 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27723920/

相关文章:

ruby-on-rails - 在 rails 控制台中预览 activerecord 查询?

ruby-on-rails - capybara webkit 驱动程序中的 javascript 确认对话框

ruby-on-rails - 详细说明 MVC 如何在 Rails 中工作,以及 Controller 如何与表单等通信?

ruby-on-rails - 注册到 FakeWeb 的 URI 列表

Sublime Text 2 中的 RubyTest

ruby-on-rails - rails RSolr::Error::ConnectionRefused:连接被拒绝错误

testing - 为什么这个应该返回 nil 的 stub 方法返回其他东西?

ruby-on-rails-3 - 在Haml中将变量打印到控制台以调试Rspec

mysql - 使用 Ruby/Rails 基于信息架构生成 MySQL View

mysql - 在 ActiveRecord 中按多个 id 获取分组值