Expected "with" matches received "with" in error message


#1

I am trying to spec a controller that sets up a page to add two
instances of an object to another (many to many :through).

In my controller_spec, I have the following statements:

  Student.should_receive(:new).and_return(mock_student)
  mock_student.should_receive(:relatives).twice
  mock_student.relatives.should_receive("<<").with(Relative.new(:parent

=> Parent.new)).twice

When I run the test, I get the following error message:

Spec::Mocks::MockExpectationError in ‘StudentsController responding to
GET new should expose a new student as @student
Mock ‘NilClass’ expected :<< with (#<Relative id: nil, parent_id: nil,
student_id: nil, created_at: nil, updated_at: nil, child_lives_with:
nil>) but received it with (#<Relative id: nil, parent_id: nil,
student_id: nil, created_at: nil, updated_at: nil, child_lives_with:
nil>)

It seems what it is receiving and expecting are the same.

Any ideas would be greatly appreciated.

Tom


#2

On Mon, Nov 3, 2008 at 9:23 AM, Tom H. removed_email_address@domain.invalid wrote:

When I run the test, I get the following error message:

Any ideas would be greatly appreciated.

ActiveRecord treats two unsaved records as unequal, even if they have
the same properties. Try this in script/console

Relative.new == Relative.new
=> false

To get this to work you’ll have to either use real records (with IDs)
or stub whatever it is that is supplying the Relative and then expect
with(the_relative_you_supply_as_a_stub_value).

Make sense?


#3

“David C.” removed_email_address@domain.invalid writes:

It seems what it is receiving and expecting are the same.
or stub whatever it is that is supplying the Relative and then expect
with(the_relative_you_supply_as_a_stub_value).

Make sense?

Also I’d like to bring attention to “Mock ‘NilClass’ expected :<<”.
mock_student.relatives is nil, but you’ll want to return something. As
for the actual problem, what David said :slight_smile:

Pat


#4

On Mon, Nov 3, 2008 at 9:30 AM, David C. removed_email_address@domain.invalid
wrote:

It seems what it is receiving and expecting are the same.

Any ideas would be greatly appreciated.

ActiveRecord treats two unsaved records as unequal, even if they have
the same properties. Try this in script/console

Relative.new == Relative.new
=> false

This fact has always bugged me, so I finally did something about it:

http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/1321
http://github.com/dchelimsky/rails/commit/03be483

Cheers,
David


#5

To get this to work you’ll have to either use real records (with IDs)
or stub whatever it is that is supplying the Relative and then expect
with(the_relative_you_supply_as_a_stub_value).

Make sense?

In part, but not 100%. Here is the code from the controller. Since all
objects are expected to be new, I am not clear whether using real
objects would create a false test. I am quite new to rspec, and
admittedly don’t fully grasp when to mock and when to not.

@student = Student.new
2.times { @student.relatives << Relative.new(:parent => Parent.new) 

}