Capybara是否在每次请求后清理其饼干?

时间:2016-01-20 11:22:43

标签: ruby-on-rails rspec capybara

当我运行此规范时

describe "as wrong user" do
        let(:user) { FactoryGirl.create(:user) }
        let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
        before { sign_in user }

        describe "submitting a GET request to the Users#edit action" do
            before { get edit_user_path(wrong_user) }
            specify { expect(response).to redirect_to(root_url) }
        end
    end

我收到此错误

  

预期回复是重定向到http://www.example.com/,但重定向到http://www.example.com/signin

但是在调用这个

后我想到了
before { sign_in user }

用户应该登录。为什么会这样?

顺便说一句,这是sign_in方法

def sign_in(user, options={})
 visit signin_path
 fill_in "Email",    with: user.email
 fill_in "Password", with: user.password
 check "Remember me"
 click_button "Sign in"
end

2 个答案:

答案 0 :(得分:1)

看起来你正在使用capybara dsl(visit等)并请求规格。后者基于rails集成测试有自己的发送请求的方法(获取,发布等)。

这两个跟踪状态,例如跨多个请求的cookie,但它们是完全分开的:混合两者只会引起混淆。然而,Capybara没有给你一个响应对象,但是应该能够使用page.current_url检查重定向是否已经发生。

或者按原样保留您的示例,但更改您的sign_in帮助程序以使用post方法提交签名数据。

rspec的最新版本试图帮助您避免这种情况,因为默认情况下不会创建内置了两个DSL的规范,而是为每个规范提供单独的规范类型(spec / api和spec / features)(请参阅here )。

答案 1 :(得分:0)

您需要维护会话

session = Capybara::Session.new(:webkit, my_rack_app)
  session.fill_in "Email",    with: user.email
  session.fill_in "Password", with: user.password
end
session.click_button 'Sign in'

在此处阅读有关Capybara的更多信息:http://www.rubydoc.info/github/jnicklas/capybara/master/Capybara/Session