Forum: RSpec Expected "with" matches received "with" in error message

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
2f030c2a9e4e1e165a0cb360805951f3?d=identicon&s=25 Tom Hoen (hoenth)
on 2008-11-03 16:23
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
5d38ab152e1e3e219512a9859fcd93af?d=identicon&s=25 David Chelimsky (Guest)
on 2008-11-03 16:31
(Received via mailing list)
On Mon, Nov 3, 2008 at 9:23 AM, Tom Hoen <lists@ruby-forum.com> 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?
42172acdf3c6046f84d644cb0b94642c?d=identicon&s=25 Pat Maddox (pergesu)
on 2008-11-03 16:52
(Received via mailing list)
"David Chelimsky" <dchelimsky@gmail.com> 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 :)

Pat
2f030c2a9e4e1e165a0cb360805951f3?d=identicon&s=25 Tom Hoen (hoenth)
on 2008-11-03 17:01
>
> 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)
}
5d38ab152e1e3e219512a9859fcd93af?d=identicon&s=25 David Chelimsky (Guest)
on 2008-11-03 17:46
(Received via mailing list)
On Mon, Nov 3, 2008 at 9:30 AM, David Chelimsky <dchelimsky@gmail.com>
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-...
http://github.com/dchelimsky/rails/commit/03be483

Cheers,
David
This topic is locked and can not be replied to.