Hi, I have a simple story that involves the user clicking a button and a new page being rendered. Seems like a simple situation, but it''s testing my limited knowledge. The problem I have is my response test is failing, and I''m guessing it''s because the button click is meant to submit a post request with an authentication token, which would therefore have to be included in the post call in my scenario''s "when" step. My question is how do I go about determining the required value of the authentication_token? Or am I just really confused? Mark.
This is actually a pretty tough problem for a newbie, and sent me reeling away from the story runner with my gumption in tatters the first time I tried it. You could probably figure out how to post an authentication token in the HTTP headers if you use the basic underlying rails integration session method post(), but you may be better off just walking through the steps a real user would carry out in order to log in: Given /logged in/ do visits "/login" fills_in :username, "Matt" fills_in :password, "secret" presses_button end This is what we do, and though instinctively it feels a little bit slow and clunky to do this at the top of every scenario that requires the user to be authenticated, in practice it''s working fine for us, and I actually find it rather nice to know you''re only vaguely coupled to the implementation. Note that these steps above use the ''webrat'' library which is the de- facto way to talk to your rails app from feature steps. On 7 Oct 2008, at 02:52, Mark Thomson wrote:> Hi, I have a simple story that involves the user clicking a button > and a new page being rendered. Seems like a simple situation, but > it''s testing my limited knowledge. The problem I have is my response > test is failing, and I''m guessing it''s because the button click is > meant to submit a post request with an authentication token, which > would therefore have to be included in the post call in my > scenario''s "when" step. My question is how do I go about determining > the required value of the authentication_token? Or am I just really > confused? > > Mark. > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users
Hmm, thanks. Still not sure if I''m diagnosing my problem correctly. Just to be clear, I don''t have any user authentication going on, just a regular Rails button_to call. I tried installing webrat and put "visits ''/'' " in my "given" step and "clicks_button" in my "when" step. However I get an error from my_story.rb - "No such file or directory - open tmp/webrat-12233801950.html. Presumably my issue would also apply in posting a form in a regular Rails integration test. The example on pp207-208 of AWDR doesn''t suggest that anything needs to be done in a post call to achieve session authentication. And I see here - http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html#M000693 that forgery protection is actually turned off in testing - which I''ve confirmed in my config/environments/test.rb. So maybe I have some other problem causing my response test to fail. Any other suggestions would be appreciated. Mark. Matt Wynne wrote:> This is actually a pretty tough problem for a newbie, and sent me > reeling away from the story runner with my gumption in tatters the > first time I tried it. > > You could probably figure out how to post an authentication token in > the HTTP headers if you use the basic underlying rails integration > session method post(), but you may be better off just walking through > the steps a real user would carry out in order to log in: > > Given /logged in/ do > visits "/login" > fills_in :username, "Matt" > fills_in :password, "secret" > presses_button > end > > This is what we do, and though instinctively it feels a little bit > slow and clunky to do this at the top of every scenario that requires > the user to be authenticated, in practice it''s working fine for us, > and I actually find it rather nice to know you''re only vaguely coupled > to the implementation. > > Note that these steps above use the ''webrat'' library which is the > de-facto way to talk to your rails app from feature steps. > > On 7 Oct 2008, at 02:52, Mark Thomson wrote: > >> Hi, I have a simple story that involves the user clicking a button >> and a new page being rendered. Seems like a simple situation, but >> it''s testing my limited knowledge. The problem I have is my response >> test is failing, and I''m guessing it''s because the button click is >> meant to submit a post request with an authentication token, which >> would therefore have to be included in the post call in my scenario''s >> "when" step. My question is how do I go about determining the >> required value of the authentication_token? Or am I just really >> confused? >> >> Mark. >> >> _______________________________________________ >> rspec-users mailing list >> rspec-users at rubyforge.org >> http://rubyforge.org/mailman/listinfo/rspec-users > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users > >
On Tue, Oct 7, 2008 at 8:36 AM, Mark Thomson <mark.thomson at ieee.org> wrote:> Hmm, thanks. Still not sure if I''m diagnosing my problem correctly. Just to > be clear, I don''t have any user authentication going on, just a regular > Rails button_to call. I tried installing webrat and put "visits ''/'' " in my > "given" step and "clicks_button" in my "when" step. However I get an error > from my_story.rb - "No such file or directory - open > tmp/webrat-12233801950.html. > > Presumably my issue would also apply in posting a form in a regular Rails > integration test. The example on pp207-208 of AWDR doesn''t suggest that > anything needs to be done in a post call to achieve session authentication. > And I see here - > http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html#M000693 > that forgery protection is actually turned off in testing - which I''ve > confirmed in my config/environments/test.rb. So maybe I have some other > problem causing my response test to fail. Any other suggestions would be > appreciated. >Have you looked at your log/test.log file to see if there are any exceptions being thrown? Or at least to see what is being rendered, perhaps you''re hitting a path you don''t intend. -- Zach Dennis http://www.continuousthinking.com http://www.mutuallyhuman.com
Another tip is to use script/console and walk the app manually. In script/console you get an app object which is the context that your story steps / integration tests run in. e.g. $script/console Loading rails blah blah blah >> app.post "/login", :username => "matt", :password => "secret" >> puts app.response.body >> app.visits "/hello" etc. Often quite handy for having an explore when you can''t figure out how to drive something from a test. On 7 Oct 2008, at 13:47, Zach Dennis wrote:> On Tue, Oct 7, 2008 at 8:36 AM, Mark Thomson <mark.thomson at ieee.org> > wrote: >> Hmm, thanks. Still not sure if I''m diagnosing my problem correctly. >> Just to >> be clear, I don''t have any user authentication going on, just a >> regular >> Rails button_to call. I tried installing webrat and put "visits ''/'' >> " in my >> "given" step and "clicks_button" in my "when" step. However I get >> an error >> from my_story.rb - "No such file or directory - open >> tmp/webrat-12233801950.html. >> >> Presumably my issue would also apply in posting a form in a regular >> Rails >> integration test. The example on pp207-208 of AWDR doesn''t suggest >> that >> anything needs to be done in a post call to achieve session >> authentication. >> And I see here - >> http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html#M000693 >> that forgery protection is actually turned off in testing - which >> I''ve >> confirmed in my config/environments/test.rb. So maybe I have some >> other >> problem causing my response test to fail. Any other suggestions >> would be >> appreciated. >> > > Have you looked at your log/test.log file to see if there are any > exceptions being thrown? Or at least to see what is being rendered, > perhaps you''re hitting a path you don''t intend. > > -- > Zach Dennis > http://www.continuousthinking.com > http://www.mutuallyhuman.com > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users
Hey thanks Zach. That was a good suggestion. What the log file showed me was that I had a nil object being accessed in my "new" action - and the reason is that it''s an object that in my development code is read from a table of global variables in my db. I create that table, including the values of the global variable, in a migration. However, this doesn''t exist in my test db. So I did a <Model>.create in my "given" step to instantiate the global variable and I''m now all good. Mark. Zach Dennis wrote:> On Tue, Oct 7, 2008 at 8:36 AM, Mark Thomson <mark.thomson at ieee.org> wrote: > >> Hmm, thanks. Still not sure if I''m diagnosing my problem correctly. Just to >> be clear, I don''t have any user authentication going on, just a regular >> Rails button_to call. I tried installing webrat and put "visits ''/'' " in my >> "given" step and "clicks_button" in my "when" step. However I get an error >> from my_story.rb - "No such file or directory - open >> tmp/webrat-12233801950.html. >> >> Presumably my issue would also apply in posting a form in a regular Rails >> integration test. The example on pp207-208 of AWDR doesn''t suggest that >> anything needs to be done in a post call to achieve session authentication. >> And I see here - >> http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html#M000693 >> that forgery protection is actually turned off in testing - which I''ve >> confirmed in my config/environments/test.rb. So maybe I have some other >> problem causing my response test to fail. Any other suggestions would be >> appreciated. >> >> > > Have you looked at your log/test.log file to see if there are any > exceptions being thrown? Or at least to see what is being rendered, > perhaps you''re hitting a path you don''t intend. > >
You may want to look into using seed data. I currently use seed_fu by mbleigh: http://github.com/mbleigh/seed-fu/tree/master Here''s the snippet I use to load them: ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[''test'']) ActiveRecord::Schema.verbose = false load "#{RAILS_ROOT}/db/schema.rb" Dir[File.join(RAILS_ROOT, "features/fixtures", ''*.rb'')].sort.each { |fixture| load fixture } I do this rather than a rake task because that takes forever (thx Brandon Keepers for correcting my usage, you have saved me tons of minutes) Zach On Tue, Oct 7, 2008 at 11:23 AM, Mark Thomson <mark.thomson at ieee.org> wrote:> Hey thanks Zach. That was a good suggestion. What the log file showed me was > that I had a nil object being accessed in my "new" action - and the reason > is that it''s an object that in my development code is read from a table of > global variables in my db. I create that table, including the values of the > global variable, in a migration. However, this doesn''t exist in my test db. > So I did a <Model>.create in my "given" step to instantiate the global > variable and I''m now all good. > > Mark. > > > > Zach Dennis wrote: >> >> On Tue, Oct 7, 2008 at 8:36 AM, Mark Thomson <mark.thomson at ieee.org> >> wrote: >> >>> >>> Hmm, thanks. Still not sure if I''m diagnosing my problem correctly. Just >>> to >>> be clear, I don''t have any user authentication going on, just a regular >>> Rails button_to call. I tried installing webrat and put "visits ''/'' " in >>> my >>> "given" step and "clicks_button" in my "when" step. However I get an >>> error >>> from my_story.rb - "No such file or directory - open >>> tmp/webrat-12233801950.html. >>> >>> Presumably my issue would also apply in posting a form in a regular Rails >>> integration test. The example on pp207-208 of AWDR doesn''t suggest that >>> anything needs to be done in a post call to achieve session >>> authentication. >>> And I see here - >>> >>> http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html#M000693 >>> that forgery protection is actually turned off in testing - which I''ve >>> confirmed in my config/environments/test.rb. So maybe I have some other >>> problem causing my response test to fail. Any other suggestions would be >>> appreciated. >>> >>> >> >> Have you looked at your log/test.log file to see if there are any >> exceptions being thrown? Or at least to see what is being rendered, >> perhaps you''re hitting a path you don''t intend. >> >> > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >-- Zach Dennis http://www.continuousthinking.com http://www.mutuallyhuman.com
Nice. Thanks. I had wondered if there was a way to separate the data initialization from the step definitions. Looks like that''s what this does. Zach Dennis wrote:> You may want to look into using seed data. I currently use seed_fu by mbleigh: > http://github.com/mbleigh/seed-fu/tree/master > > Here''s the snippet I use to load them: > > ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[''test'']) > ActiveRecord::Schema.verbose = false > load "#{RAILS_ROOT}/db/schema.rb" > Dir[File.join(RAILS_ROOT, "features/fixtures", ''*.rb'')].sort.each { > |fixture| load fixture } > > I do this rather than a rake task because that takes forever (thx > Brandon Keepers for correcting my usage, you have saved me tons of > minutes) > > Zach > > > On Tue, Oct 7, 2008 at 11:23 AM, Mark Thomson <mark.thomson at ieee.org> wrote: > >> Hey thanks Zach. That was a good suggestion. What the log file showed me was >> that I had a nil object being accessed in my "new" action - and the reason >> is that it''s an object that in my development code is read from a table of >> global variables in my db. I create that table, including the values of the >> global variable, in a migration. However, this doesn''t exist in my test db. >> So I did a <Model>.create in my "given" step to instantiate the global >> variable and I''m now all good. >> >> Mark. >> >> >> >> Zach Dennis wrote: >> >>> On Tue, Oct 7, 2008 at 8:36 AM, Mark Thomson <mark.thomson at ieee.org> >>> wrote: >>> >>> >>>> Hmm, thanks. Still not sure if I''m diagnosing my problem correctly. Just >>>> to >>>> be clear, I don''t have any user authentication going on, just a regular >>>> Rails button_to call. I tried installing webrat and put "visits ''/'' " in >>>> my >>>> "given" step and "clicks_button" in my "when" step. However I get an >>>> error >>>> from my_story.rb - "No such file or directory - open >>>> tmp/webrat-12233801950.html. >>>> >>>> Presumably my issue would also apply in posting a form in a regular Rails >>>> integration test. The example on pp207-208 of AWDR doesn''t suggest that >>>> anything needs to be done in a post call to achieve session >>>> authentication. >>>> And I see here - >>>> >>>> http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html#M000693 >>>> that forgery protection is actually turned off in testing - which I''ve >>>> confirmed in my config/environments/test.rb. So maybe I have some other >>>> problem causing my response test to fail. Any other suggestions would be >>>> appreciated. >>>> >>>> >>>> >>> Have you looked at your log/test.log file to see if there are any >>> exceptions being thrown? Or at least to see what is being rendered, >>> perhaps you''re hitting a path you don''t intend. >>> >>> >>> >> _______________________________________________ >> rspec-users mailing list >> rspec-users at rubyforge.org >> http://rubyforge.org/mailman/listinfo/rspec-users >> >> > > > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20081007/b048b4a3/attachment.html>