[rspec-users] controller filters running twice in 1.1.4?

Pat Maddox pergesu at gmail.com
Tue Jun 3 23:29:31 EDT 2008


On Tue, Jun 3, 2008 at 7:27 PM, Matt McNeil <nabble at mattmcneil.org> wrote:
>
>
> Pat Maddox wrote:
>>
>> On Tue, Jun 3, 2008 at 5:31 PM, Matt McNeil <nabble at mattmcneil.org> wrote:
>>>
>>> since upgrading to 1.1.4 (I had been running without issue on a git
>>> snapshot), I'm noticing that my filter actions initiated from
>>> application.rb
>>> seem to be running twice.  I created a test rails project with the rspec
>>> scaffold and am also seeing the same behavior here too.
>>>
>>> Adding this code to application.rb:
>>>
>>>  before_filter :foo
>>>
>>>  def foo
>>>    "foo"
>>>  end
>>>
>>> and an example in users_controller_spec.rb:
>>>
>>>    it "should call foo via a before filter" do
>>>      controller.should_receive(:foo)
>>>      do_get
>>>    end
>>>
>>> results in this:
>>>
>>> 1)
>>> Spec::Mocks::MockExpectationError in 'UsersController handling GET
>>> /users.xml should call foo'
>>> Mock 'UsersController' expected :foo with (any args) once, but received
>>> it
>>> twice
>>> script/spec:4:
>>>
>>> Is any one else seeing this?
>>
>> Can you put a print statement inside application.rb to see if the file
>> itself is being loaded multiple times?
>>
>> Pat
>> _______________________________________________
>>
>>
> Hi Pat,
>
> Yes, application.rb appears to be getting loaded twice.  Things are fine
> when the before_filter is being called from the UsersController:
>
> class UsersController < ApplicationController
>
>  before_filter :foo
>
>  puts "#{__FILE__} loaded " + Time.now.to_s
>
>
> /opt/local/bin/ruby -S script/spec -O spec/spec.opts
> spec/controllers/users_controller_spec.rb
> /Users/matt/test/app/controllers/users_controller.rb loaded Tue Jun 03
> 19:20:44 -0700 2008
> ...................................
>
> Finished in 0.256665 seconds
>
> 35 examples, 0 failures
>
> however, when that filter macro is moved to application.rb:
>
> class ApplicationController < ActionController::Base
>  helper :all # include all helpers, all the time
>
>  before_filter :foo
>
>  puts "#{__FILE__} loaded " + Time.now.to_s
>
> here's what happens:
>
> /opt/local/bin/ruby -S script/spec -O spec/spec.opts
> spec/controllers/users_routing_spec.rb
> spec/controllers/users_controller_spec.rb
> /Users/matt/test/app/controllers/application.rb loaded Tue Jun 03 19:23:32
> -0700 2008
> /Users/matt/test/app/controllers/application.rb loaded Tue Jun 03 19:23:32
> -0700 2008
> ..........................................F.....
>
> 1)
> Spec::Mocks::MockExpectationError in 'UsersController handling GET
> /users.xml should call foo via a before filter'
> Mock 'UsersController' expected :foo with (any args) once, but received it
> twice
> script/spec:4:
>
> Finished in 0.2891 seconds
>
> 48 examples, 1 failure

Do you require application.rb from anywhere, but including the whole
path?  i.e. require File.join(RAILS_ROOT, "app", "controllers",
"application").  If you require the same file twice, but using two
different paths, then it'll be loaded twice.

This may happen from a plugin you've got loaded as well.

Another thing to check is the paths in your generated specs.  I
changed those a couple weeks ago, but to avoid this type of problem.
I may have screwed up, or perhaps you've got a mix of requires from
older gen'd specs and newer ones.

Pat


More information about the rspec-users mailing list