如果我有一个Desive model用户,其中只有那些角色为:admin的用户才允许查看某个url,我如何编写RSpec集成测试来判断该url的状态是否返回200?

def login(user)
  post user_session_path, :email => user.email, :password => 'password'
end

这个问题的答案是假的:Stubbing authentication in request spec,但我一辈子都无法让它与Desive一起工作.CanCan在判断能力时接收到一个nil用户,当然,该能力没有正确的权限.

集成规范中没有对控制器的访问权限,所以我不能对当前的用户进行存根,但我想这样做.

describe "GET /users" do
  it "should be able to get" do
    clear_users_and_add_admin #does what it says...
    login(admin)
    get users_path
    response.status.should be(200)
  end
end

NOTE!!!:自从提出这个问题以来,所有这些都发生了变化.目前最好的方法是:http://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara

推荐答案

@普赛格的回答越过了我的底线.为了完整性,我这样做可以轻松设置请求规范和控制器规范(使用FactoryGirl创建用户实例):

in/spec/support/sign_in_support.rb:

#module for helping controller specs
module ValidUserHelper
  def signed_in_as_a_valid_user
    @user ||= FactoryGirl.create :user
    sign_in @user # method from devise:TestHelpers
  end
end

# module for helping request specs
module ValidUserRequestHelper

  # for use in request specs
  def sign_in_as_a_valid_user
    @user ||= FactoryGirl.create :user
    post_via_redirect user_session_path, 'user[email]' => @user.email, 'user[password]' => @user.password
  end
end

RSpec.configure do |config|
  config.include ValidUserHelper, :type => :controller
  config.include ValidUserRequestHelper, :type => :request
end

然后在请求规范中:

describe "GET /things" do
  it "test access to things, works with a signed in user" do
    sign_in_as_a_valid_user
    get things_path
    response.status.should be(200)
  end
end

describe "GET /things" do
  it "test access to things, does not work without a signed in user" do
    get things_path
    response.status.should be(302) # redirect to sign in page
  end
end

同样,在控制器规范中使用"signed_in_as_valid_user"(它包装了designe::TestHelpers与FactoryGirl的用户sign_in方法)

Ruby-on-rails相关问答推荐

如何修复:错误:'' 没有提交判断致命:输入“git add”时添加文件失败.在命令提示符下

错误“未初始化的常量 AWS (NameError)”

将 Ruby 日期转换为整数

控制器规格未知关键字:id

如何将 SQL 文件导入 Rails 数据库?

监听错误:无法监视目录的更改

如何为日期时间列设置默认值以记录迁移中的创建时间?

为什么我的 RSpec 没有加载 Devise::Test::ControllerHelpers?

等效于 Rails 的安全导航 try for hashes

Rails 服务器仍在新打开的 docker 容器中运行

Rails 5:无法从参数中检索哈希值

Sidekiq 在 docker-compose 上的 127.0.0.1:6379 (Errno::ECONNREFUSED) 上连接到 Redis 时出错

":nothing" 选项已弃用,将在 Rails 5.1 中删除

错误原始错误:未安装 ImageMagick/GraphicsMagick

Rails API:实现身份验证的最佳方式?

xxx 的副本已从模块树中删除,但仍处于活动状态

如何更改 Rails 4.2 开发服务器的默认绑定 ip?

在rails 4中没有计数的复数

使用 heroku 和 namecheap 设置自定义域

Rspec 3 如何测试闪存消息