I'm trying to test a scope I have that is based upon a chain of other scopes. ("public_stream" below).
scope :public, where("entries.privacy = 'public'")
scope :completed, where("entries.observation <> '' AND entries.application <> ''")
scope :without_user, lambda { |user| where("entries.user_id <> ?", user.id) }
scope :public_stream, lambda { |user| public.completed.without_user(user).limit(15) }
Using a test like this:
it "should use the public, without_user, completed, and limit scopes" do
@chain = mock(ActiveRecord::Relation)
Entry.should_receive(:public).and_return(@chain)
@chain.should_receive(:without_user).with(@user).and_return(@chain)
@chain.should_receive(:completed).and_return(@chain)
@chain.should_receive(:limit).with(15).and_return(Factory(:entry))
Entry.public_stream(@user)
end
However, I continue to receive this error:
Failure/Error: Entry.public_stream(@user)
undefined method `includes_values' for #<Entry:0xd7b7c0>
It seems includes_values is an instance variable of the ActiveRecord::Relation object, but when I try to stub it, I still receive the same error. I was wondering if anyone had experience with stubing Rails 3's new chained queries? I can find a bunch of discussion over 2.x's find hash, but nothing on how to test what's current.
I use rspec's stub_chain
for this. You might be able to use something like:
some_model.rb
scope :uninteresting, :conditions => ["category = 'bad'"],
:order => "created_at DESC"
Controller
@some_models = SomeModel.uninteresting.where(:something_else => true)
spec
SomeModel.stub_chain(:uninteresting, :where) {mock_some_model}
Same Answer as above.
SomeModel.stub_chain(:uninteresting, :where) {mock_some_model}
Rspec 3 version:
allow(SomeModel).to receive_message_chain(:uninteresting).and_return(SomeModel.where(nil))
Reference:
https://relishapp.com/rspec/rspec-mocks/docs/method-stubs/stub-a-chain-of-methods
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With