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

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

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 # 

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

似乎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文章,并展示了实现 。

另一种选择是使用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文档而言并非如此。

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

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

请参阅相关的RailsTutorial:NoM​​ethodError’permanent’Rake :: Test :: CookieJar