如果我有一个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
我试图通过向我发送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_in或current_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)