相关疑难解决方法(0)

如何使用RSpec和Devise/CanCan进行集成测试?

如果我有一个Devise模型User,其中只允许那些具有role:admin的用户查看某个url,我该如何编写RSpec集成测试来检查该url的状态是否返回200?

def login(user)
  post user_session_path, :email => user.email, :password => 'password'
end
Run Code Online (Sandbox Code Playgroud)

在这个问题的答案中,这是伪建议:在请求规范中对验证进行验证,但我不能为我的生活让它与设计一起工作.当自动检查具有正确权限的Ability时,CanCan正在接收nil用户.

在集成规范中无法访问控制器,因此我无法存根current_user,但我想做类似的事情.

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
Run Code Online (Sandbox Code Playgroud)

注意!!!:自提出问题以来,这一切都发生了变化.目前最好的方法是:http://github.com/plataformatec/devise/wiki/How-To : -Test-with-Capybara

rspec ruby-on-rails devise cancan

36
推荐指数
3
解决办法
3万
查看次数

Rails测试 - 检查用户是否使用Devise登录

我试图通过向我发送POST请求来测试某人是否能够登录我的网站SessionsController.我在几个地方看到过这种推荐方式:

it 'must be able to sign in a user' do
  user = create(:user)
  post :create, format: :js, user: {email: user.email, password: user.password, remember_me: 0}
  assert_response :success
  @controller.current_user.must_equal user
end
Run Code Online (Sandbox Code Playgroud)

但这个测试不正确.调用@controller.current_user将尝试使用已发布的参数对用户进行身份验证,并user在提供的电子邮件/密码正确时返回.无法保证该create操作实际上是在调用sign_incurrent_user.

即使我重新编写测试以检查这些方法是否被调用,也可能会调用其他方法,例如sign_out.

是否有更明确的方法来最终检查用户是否已登录,如果是,用户是谁?

编辑 -

例如,以下测试将通过

it 'must sign in a user' do
   @controller.current_user.must_equal nil
   post :create, format: :js, user: {email: @user.email, password: @user.password, remember_me: 0}
   assert_response :success
   @controller.current_user.must_equal @user
end
Run Code Online (Sandbox Code Playgroud)

当SessionsController #create动作是:

def create
  respond_to …
Run Code Online (Sandbox Code Playgroud)

ruby authentication ruby-on-rails devise warden

8
推荐指数
1
解决办法
1748
查看次数

标签 统计

devise ×2

ruby-on-rails ×2

authentication ×1

cancan ×1

rspec ×1

ruby ×1

warden ×1