当我运行此规范时
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
答案 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