Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 水豚会在每次请求后清理饼干吗?_Ruby On Rails_Rspec_Capybara - Fatal编程技术网

Ruby on rails 水豚会在每次请求后清理饼干吗?

Ruby on rails 水豚会在每次请求后清理饼干吗?,ruby-on-rails,rspec,capybara,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 t

当我运行这个规范时

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
我得到这个错误

预期响应为重定向到,但为重定向到

但我觉得打了电话之后

before { sign_in user }
用户应登录。为什么会这样

顺便说一句,这里是登录方法

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
您需要维护会话
阅读更多关于Capybara的信息:

看起来您同时使用了Capybara dsl(
访问
等等)和请求规范。后者基于rails集成测试,有自己的发送请求的方法(get、post等)

这两种方法都可以跟踪状态,例如跨多个请求跟踪cookie,但它们是完全独立的:混合使用这两种方法只会导致混淆。但是,水豚不会给你一个响应对象,但应该能够使用
page.current\u url
检查重定向是否发生

或者,让您的示例保持原样,但将sign_in helper更改为使用
post
方法提交签名数据


rspec的最新版本试图帮助您避免这种情况,因为默认情况下不创建同时具有两个DSL内置的规范,而是为每个DSL创建单独的规范类型(规范/api和规范/功能)(请参见)。

该规范中的所有内容都在测试,以查看如果资源的用户错误,会发生什么情况。不管失败与否,你都应该让测试看起来像它正在测试的一样。登录有效吗?@DaveNewton,sign_-in有效,用户登录,直到我调用“get edit_-user_-path(error_-user)”,然后cookies[:记住\u-token]are null提供了更多关于
get
visit
之间区别的详细信息,谢谢-我模糊地记得以前看到过类似的东西,但找不到。@FrederickCheung,非常感谢!我会记住你关于DSL分离的评论。顺便说一句,我知道发生了什么。整个要点都在“之前”部分。我不知道为什么,但是每个水豚请求(比如访问或获取)都有自己的干净会话,如果你在“前块”中调用它们,它们会有一个干净的cookies。我不知道为什么。我认为这个块是为其他目的创建的,但事实并非如此,关键是
get
不会在任何时候发出水豚请求all@FrederickCheung,我真是个笨蛋。水豚请求和rspec请求是分开的,你说得对。我刚刚将登录方法更改为使用rspec post,现在一切正常。谢谢你,你是最棒的!
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'