Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails Fixtures not loading with rspec

So, I'm trying to learn the rspec BDD testing framework in the context of a rails project. The problem I'm having is that I can't, for the life of me, get my fixtures to load properly in rspec descriptions.

Disclaimer: Yes, there are better things than fixtures to use. I'm trying to learn one thing at a time, here (specifically rspec) before I go play with associated tools like factory-girl, mocha, auto-test, etc. As such, I'm trying to get the dead-simple, if clunky, fixtures working.

Anyway, here's the code:

/test/fixtures/users.yml -

# password: "secret" foo:   username: foo   email: [email protected]   password_hash: 3488f5f7efecab14b91eb96169e5e1ee518a569f   password_salt: bef65e058905c379436d80d1a32e7374b139e7b0  bar:   username: bar   email: [email protected]   password_hash: 3488f5f7efecab14b91eb96169e5e1ee518a569f   password_salt: bef65e058905c379436d80d1a32e7374b139e7b0 

/spec/controllers/pages_controller_spec.rb -

require 'spec/spec_helper'  describe PagesController do   integrate_views   fixtures :users   it "should render index template on index call when logged in" do     session[:user_id] = user(:foo).id     get 'index'      response.should render_template('index')   end end 

And what I'm getting when I run 'rake spec' is:

NoMethodError in 'PagesController should render index template on index call when logged in' undefined method `user' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1:0x2405a7c> /Library/Ruby/Gems/1.8/gems/actionpack-2.3.5/lib/action_controller/test_process.rb:511:in `method_missing' ./spec/controllers/pages_controller_spec.rb:7: 

That is, it's not recognizing 'user(:foo)' as a valid method.

The fixtures themselves must be ok, since when I load them into the development db via 'rake db:fixtures:load', I can verify that foo and bar are present in that db.

I feel like I'm missing something obvious here, but I've been tearing my hair out all day to no avail. Any help would be appreciated.

like image 787
Fishtoaster Avatar asked Dec 29 '09 20:12

Fishtoaster


1 Answers

If you define fixtures as 'users', then the way to use them is via the method with the same name:

describe PagesController do   integrate_views   fixtures :users   it "should render index template on index call when logged in" do     session[:user_id] = users(:foo).id     get 'index'     response.should render_template('index')   end end 

The singular is only relevant to the class itself (User). Hope you still have some hair left if this is just a one letter bug.

like image 111
tadman Avatar answered Sep 20 '22 12:09

tadman