On Jul 17, 2010, at 8:09 AM, David Chelimsky wrote: > > On Jul 17, 2010, at 3:29 AM, Daniel Salmeron Amselem wrote: > >> Today I've been writing some tests for a new rails 3 app, but after >> reading the doc from http://rdoc.info/projects/rspec/rspec-expectations, >> I still can't understand why the test doesn't work. My setup is: >> >> rvm 0.1.41 >> ruby 1.9.2dev (2010-07-11 revision 28618) [x86_64-darwin10.4.0] -> >> ruby 1.9.2-rc2 >> rspec 2.0.0.beta.17 >> rspec-rails 2.0.0.beta.17 >> devise 1.1.rc2 >> >> This is the test for the controller: >> >> >> require 'spec_helper' >> >> describe PeopleController do >> >> describe "routes" do >> it "should route to GET people#new" do >> {:get => "/people/new"}.should route_to(:controller => >> "people", :action => "new") >> end >> end >> >> describe "Methods" do >> >> before :each do >> @member = Factory(:member) >> sign_in @member >> @person = @member.build_person >> end >> >> it "should render form for a new person on GET people#new" do >> @member.should_receive(:build_person).and_return(@person) >> >> get :new >> >> assigns[:person].should eql(@person) >> response.should be_success >> response.should render_template("new") >> end >> end >> >> end >> >> And the controller: >> >> class PeopleController < ApplicationController >> before_filter :authenticate_member! >> >> def new >> @person = current_member.build_person >> end >> >> end >> >> When running the test I get: >> >> >> .F................. >> >> 1) PeopleController Methods should render form for a new person on GET >> people#new >> Failure/Error: assigns[:person].should eql(@person) >> >> expected #<Person id: nil, first_name: nil, last_name: nil, >> gender: nil, university: nil, year: nil, email: nil, phone: nil, >> house: nil, user_account_id: 126, user_account_type: "Member", >> home_town: nil, bio: nil, current_location: nil, high_school: nil, >> undergrad: nil, profession: nil, concentration: nil, created_at: nil, >> updated_at: nil> >> got #<Person id: nil, first_name: nil, last_name: nil, >> gender: nil, university: nil, year: nil, email: nil, phone: nil, >> house: nil, user_account_id: 126, user_account_type: "Member", >> home_town: nil, bio: nil, current_location: nil, high_school: nil, >> undergrad: nil, profession: nil, concentration: nil, created_at: nil, >> updated_at: nil> > > Here's how ActiveRecord defines == (to which it delegates from eql?) > > http://github.com/rails/rails/blob/c6e20586372743ce200449bf0ac21aed04c6b81e/activerecord/lib/active_record/base.rb#L1536 > > It returns false if the record has no id (!comparison_object.new_record?), > even if all of the other attributes match. In order to get this to pass you > have to actually save the object so it has an id, not just build it. > > I discussed this with Rails core members a year or two ago and while they > agreed this would make testing easier, there were two motivating arguments > not to change it: a) conceptually, id-less records are not necessarily the > same entity (this one is a bit fuzzy to me) and b) it's a risky change given > the amount of rails code in existence. > > The other thing you can do is skip the stubbing and just say: > > assigns(:person).should be_a_new(Person) > > You could also write a custom matcher - something like > match_new_record(other) that compares all of the attributes. Maybe it's > have_same_attributes_as: > > assigns(:person).should have_same_attributes_as(@person) > > I'd consider adding that to rspec-rails. Might be good to have a matcher with > docs that explain all this to help avoid this sort of confusion in the future.
Another option would be to add something like this: RSpec.configure do |c| c.treat_new_active_record_objects_as_equal end ... and have that override ==(other) on ActiveRecord::Base. It's invasive, but you have to take an action to do the override. WDYT? > > WDYT?, > David > > >> >> (compared using eql?) >> # ./spec/controllers/people_controller_spec.rb:24:in `block (3 >> levels) in <top (required)>' >> >> >> Finished in 2.29 seconds >> 19 examples, 1 failure >> >> The error with the full backtrace here: http://gist.github.com/479362 >> >> Which doesn't seem to make sense. Any ideas? >> >> Thanks. >> _______________________________________________ >> rspec-users mailing list >> rspec-users@rubyforge.org >> http://rubyforge.org/mailman/listinfo/rspec-users > _______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users