25
votes

Helper Method

  # Determine if this is user's first time
  def first_time?
    cookies[:first_time].nil?
  end

Attempted Rspec test

it "returns true if the cookie is set" do
  cookies[:first_time] = "something"
  helper.first_time?().should be(true)
end

Error:

undefined method `cookies' for nil:NilClass

Everything I've read about Rspec and cookies has to do with the controller. Any way to get/set cookies in Rspec helper tests?

(Rspec/Rspec-rails 2.5, Rails 3.0.4)

Thanks!!

UPDATE:

Found an answer on how to SET cookies, so I'll leave it here for other's reference.

the piece I was looking for:

helper.request.cookies[:awesome] = "something"

Still don't know how to GET cookies...

5
Just curious, why would you want to GET cookies? In specs you are always the one that sets the cookies, so you know what they are. Don't you just want to test that your app behaves a certain way with the cookies set a certain way? - radixhound
GET is just helper.request.cookies[:awesome] - Michael Durrant

5 Answers

21
votes

The best explanation I've been able to find is here: https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs/cookies

Quoted:

Recommended guidelines for rails-3.0.0 to 3.1.0

  • Access cookies through the request and response objects in the spec.
  • Use request.cookies before the action to set up state.
  • Use response.cookies after the action to specify outcomes.
  • Use the cookies object in the controller action.
  • Use String keys.

Example:

# spec
request.cookies['foo'] = 'bar'
get :some_action
response.cookies['foo'].should eq('modified bar')

# controller
def some_action
  cookies['foo'] = "modified #{cookies['foo']}"
end
5
votes

I just stumbled upon your question (I was looking for an answer). I tried this successfully:

helper.request.cookies[:foo] = "bar"
1
votes

None of the answers worked for me on Rails 6.1.3, but after much testing, the following worked:

helper.cookies[:foo] = "bar"

And for signed cookies:

helper.cookies.signed[:foo] = "bar"
0
votes

You get the cookies the same way you set them. Example from one of my specs:

request.cookies[:email].should be nil
0
votes

In a controller test this works:

@request.cookies[:cookie_name] = "cookie_value"

in a before block.

I found this here