[rspec-users] testing around_save

apneadiving apnea.diving.deep at gmail.com
Fri Feb 24 13:58:58 UTC 2012

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
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 }

           it "check callback" do

           it "check transition" do
             document.status.should eq "in_progress"


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

More information about the rspec-users mailing list