Hi David and thanks again,
I run Rspec 2.8.0. and just upgraded from Rails 3.0.10 to Rails 3.2.1.
I must admit, the spec wasn''t clean. But it was quick and easy...
Of course I keep your advice in mind, I just have to adapt to my
particular case:
* I work on a legacy and untested app, so factories require much time
to be built
* the callbacks run a lot of code which require I load plenty of data
in the object, a bit overkill just to check whether or not the
callback is triggered
* I run a state machine and I want to be sure proper callbacks are
called (or not) from one step to another, so there are many specs.
I finally decided to redefine the callback content for the current
object, since, in these particular specs, I don''t care of what happens
inside.
I had to split my specs in two parts:
context "initial status waiting_assignment" do
before(:each) do
document.instance_eval { def on_progress; yield; end }
end
it "check callback" do
document.should_receive(:on_progress)
document.status_progress
end
it "check transition" do
document.status_progress
document.status.should eq "in_progress"
end
end
On Feb 24, 2:36?am, David Chelimsky <dchelim... at gmail.com>
wrote:> On Feb 23, 2012, at 3:36 PM, apneadiving wrote:
>
> > I''ve just upgraded to Rails 3.2.1 and I can''t get my
specs checking
> > whether or not around_save work anymore.
>
> What version did you upgrade from? Anything else change in the process?
>
> > I simply did something like:
>
> > object.should_receive :around_filter_name
> > object.save.should be_true
>
> > (Actually, it was slightly more complex, it''s part of a state
machine)
>
> Mock objects (message expectations / should_receive) are for specifying
interaction _between objects_, not internal implementation of a single object.
There are plenty of guidelines that point in that direction, two of which are
explicitly violated in this example:
>
> 1. mock your own code, not your dependencies (in this case you''re
mocking ActiveRecord internals)
> 2. don''t mock the subject of a test
>
> The motivation for both of these guidelines is exactly what you''re
experiencing. Something changed out from under you and you have no idea what and
why your test doesn''t work anymore. I''d recommend using a
black block approach for this instead of a message expectation: get the object
into the state you want, call object.save, and then specify the resulting state.
>
> HTH,
> David
> _______________________________________________
> rspec-users mailing list
> rspec-us... at
rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users