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...@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...@rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to