尝试创建cookie时未定义的方法`permanent'

时间:2014-02-01 20:41:50

标签: ruby-on-rails cookies rspec

我创建了一个模块,因此我可以快速创建用户,以用户身份登录,删除用户并注销用户。这是一个简化的例子:

module UserAuth
    def sign_in(user)
        cookies.permanent[:remember_token] = 'asda'
    end
end

但是,如果我运行此规范:

describe 'UserAuth' do
    include UserAuth

    context 'signed up' do
        let(:user_1) { FactoryGirl.build(:user) }
        before { sign_up user_1 }

        contex 'signed in' do
            before { sign_in user_1 }

            it {}

        end
    end
end

我收到此错误:

   undefined method `permanent' for #<Rack::Test::CookieJar:#>

我觉得奇怪的是cookies对象可用,但这种permanent方法不是出于某种原因。我可以通过在UserAuth模块中包含另一个模块来解决此问题吗?如果是这样,这个模块的名称是什么?

2 个答案:

答案 0 :(得分:0)

似乎RackTest CookieJar和Cookie类不提供这些方法在其MockSession中进行测试。我做的是模仿以这种方式设置cookie的方法,而是返回我自己的结果,或者使用RackTest的cookie方法来设置cookie。

注意:在这个例子中,我模拟了一个通过关注点设置cookie的方法。

before :each do
  allow(MyConcern).to receive(cookie_method) { create(:cookie, :test) }
end

it 'tests cookie' do
  cookie_method

  expect {
    put item_path({test_id: 2})
  }.to change(Item, :test_id)

  expect(response.cookies[:cookie_id]).to eq 'test'
end 

这是另一篇涉及同一问题的SO文章,showing implementations

另一种选择是使用RackTest的CookieJar方法,它提供了cookie创建的基础知识,以及其他一些选项。

it 'has a cookie' do
  cookies[:remember_token] = 'my test'
  post items_path
  expect(response.cookies[:remember_token]).to eq 'my test'
end

您可以查看RackTest CookieJar/Cookie Source中的方法,这些方法非常简单,但对于API docs而言并非如此。

我希望能帮到某个人,我也希望别人能找到更好的解决方案!

答案 1 :(得分:-1)

我建议您按照Rails教程中定义的方法进行测试,如http://ruby.railstutorial.org/book/ruby-on-rails-tutorial#code-sign_in_helper所示。 CookieJar中的Rack::Test对象与ActionDispatch::Cookies中Rails使用的对象不同。

参见相关的RailsTutorial: NoMethodError 'permanent' Rake::Test::CookieJar