I've got something like this:

# post_observer.rb

after_create
  # ...stuff
  Delayed::Job.enqueue(PostSharer.new(post, post.user))
end

...

# post_sharer.rb

class PostSharer < Struct.new(:post, user)

  def perform
    # Delayed::Job calls .perform on the object passed into enqueue
  end

end

# post_controller_spec.rb

it "shares the post" do

  PostSharer.expects(:new).once
  lambda { do_post }.should change(Delayed::Job, :count).by(1)

end

...

This fails due to the expectation put on PostSharer receiving .new --- if I
remove that, then it all works fine...  And if I look at the test database,
Delayed::Job has created a job for PostSharer, so it is all working as
desired..  I just wanted to take it a step further and ensure that the right
class is being instantiated.  I am assuming this is because setting an
expectation on new is somehow changing the structure of the class and confusing
delayed job?  Maybe because it's a struct?

  1) PostsController creating a post sharing shares when it should
     Failure/Error: post :create, { :submit_action => submit_type.to_s, :post 
=> new_post(post_attributes).attributes }
     ArgumentError:
       Cannot enqueue items which do not respond to perform
     # ./app/observers/post_observer.rb:12:in `after_create'
     # ./app/models/post.rb:156:in `set_state_to_open_for_free_requests'
     # ./app/controllers/posts_controller.rb:39:in `create'
     # ./spec/controllers/post_controller_spec.rb:8:in `do_post'
     # ./spec/controllers/post_controller_spec.rb:77
     # ./spec/controllers/post_controller_spec.rb:75

Patrick J. Collins
http://collinatorstudios.com

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to