Alias_method_chain and ActiveSupport::TestCase

I’m trying to add some functionality to the setup method of all my
tests.

I added a method called setup_with_ts in the test_helper and chained
it using alias_method_chain :setup, :ts and that works great for every
test that does not define setup in the test.

So for my unit tests i tried also defining the same method
setup_with_ts in a
class ActiveSupport::TestCase
def setup_with_ts
puts “setup with ts”
setup_without_ts
end
alias_method_chain :setup, :ts
end

it was just a test to see what would happen.

if i called this method in the setup of a test like :
def setup
setup_with_ts
.
.
.
end

that will call it just fine so the method exists. but if i remove the
setup_with_ts line and run a test the setup method in the test runs,
but it never runs my aliased chained method.

i’m not sure why the alias_method_chain seems to work for test with no
setup method and not for one that has a setup method defined. Any
help would be great.

Thanks.
Erik

Just an update:

It is some kind of order of file loading or something.

If i put
def setup_with_ts
puts “setup with ts”
setup_without_ts
end
alias_method_chain :setup, :ts

that directly into a test with a setup method it works fine, but not
if i define it in the test_helper.rb

Erik

Another update:
if i do:
class ActiveSupport::TestCase
def setup_with_ts
puts “setup with ts”
setup_without_ts
end
alias_method_chain :setup, :ts
end

and then do puts self.methods in one of my tests it shows those
methods exist. but they do not get called unless i define
setup_with_ts and alias it in each test…

On Oct 21, 7:38 pm, erik [email protected] wrote:

i’m not sure why the alias_method_chain seems to work for test with no
setup method and not for one that has a setup method defined. Any
help would be great.

In a nutshell, because there is no reason it should. If a class
overrides the superclass implementation of a method then that
superclass implementation is not called unless the new implementation
explicitly does it. You should be able to do

def setup
super

end

However you don’t need to do all this, because ActiveSupport::TestCase
already handles this sort of stuff. If you do

class ActiveSupport::TestCase
def setup_with_ts
end

setup :setup_with_ts
end

then your method will get called at the appropriate time
(ActiveSupport sets up a callback chain that is run just before setup
is called)

Fred