RSpec fails when matching two classes, even though the classes are _identical_

179 Views Asked by At

I have the following piece of code that checks if the returned video object is the same as the one I put in.

The video object is a Panda Stream object, and referring to their homepage, the Panda::Video.find should return exactly the object I put in with the Panda::Video.create method.

# screencast_spec.rb
before(:each) do
  @screencast = Factory.build(:screencast)
  @video = Panda::Video.create(:source_url => "http://panda-test-harness-videos.s3.amazonaws.com/panda.mp4")
end
it "should fetch the video with the #video method" do
  @screencast.video = @video
  @screencast.video.should == @video
end

# screencast.rb
# Returns the panda::video object
def video
  Panda::Video.find(self.video_id)
end
# Sets the +video_id+ reference
def video= video_object_or_id
  video_object_or_id = video_object_or_id.id unless video_object_or_id.is_a?(Integer)
  self.video_id = video_object_or_id
end

The error that RSpec returns is this:

1) Screencast#video should fetch the video with the #video method
Failure/Error: @screencast.video.should == @video
   expected: #<Panda::Video id: "dac9bf057c9b667f57096054a64625a1", created_at: "2012/01/29 18:04:07 +0000", updated_at: "2012/01/29 18:04:07 +0000", original_filename: "panda.mp4", source_url: "http://panda-test-harness-videos.s3.amazonaws.com/panda.mp4", duration: nil, height: nil, width: nil, extname: ".mp4", file_size: nil, video_bitrate: nil, audio_bitrate: nil, audio_codec: nil, video_codec: nil, fps: nil, audio_channels: nil, audio_sample_rate: nil, status: "processing", path: "dac9bf057c9b667f57096054a64625a1", cloud_id: "55372b1612963b045f27bb093fed0abb">
        got: #<Panda::Video id: "dac9bf057c9b667f57096054a64625a1", created_at: "2012/01/29 18:04:07 +0000", updated_at: "2012/01/29 18:04:07 +0000", original_filename: "panda.mp4", source_url: "http://panda-test-harness-videos.s3.amazonaws.com/panda.mp4", duration: nil, height: nil, width: nil, extname: ".mp4", file_size: nil, video_bitrate: nil, audio_bitrate: nil, audio_codec: nil, video_codec: nil, fps: nil, audio_channels: nil, audio_sample_rate: nil, status: "processing", path: "dac9bf057c9b667f57096054a64625a1", cloud_id: "55372b1612963b045f27bb093fed0abb"> (using ==)
   Diff:
 # ./spec/models/screencast_spec.rb:26:in `block (3 levels) in <top (required)>'

Note the diff saying that there is no difference between the two objects, so why is the comparison failing?

If any of you have any pointers, or have tried testing the panda stream before I would appreciate all the guidance I can get

1

There are 1 best solutions below

0
On BEST ANSWER

ruby provides 3 methods for testing for equality == eql? equals?. when using == you are comparing by object identity. ruby uses the object-id for this. the important thing is that classes can redefine == like it's done for string-comparison.

if you wan't to learn more on this topic i can advise you this blog post: http://www.skorks.com/2009/09/ruby-equality-and-object-comparison/