test "this is a test" do vs def this_is_a_test

The "test" method copied below complains when another test of the same
name if found in another test file.

The following doesn't work...

test/integration/users_test.rb
test "this is a test" do
...
end

test/integration/forums_test.rb
test "this is a test" do
...
end

but this does work...

test/integration/users_test.rb
def this_is_a_test
...
end

test/integration/forums_test.rb
def this_is_a_test
...
end

What's the purpose for "test" working this way?

# File vendor/rails/activesupport/lib/active_support/testing/declarative.rb,
line 7
7: def test(name, &block)
8: test_name = "test_#{name.gsub(/\s+/,'_')}".to_sym
9: defined = instance_method(test_name) rescue false
10: raise "#{test_name} is already defined in #{self}" if defined
11: if block_given?
12: define_method(test_name, &block)
13: else
14: define_method(test_name) do
15: flunk "No implementation provided for #{name}"
16: end
17: end
18: end

What's the purpose for "test" working this way?

It should only be doing this if the method you're defining would be
*replacing* another test, it shouldn't matter if you have test with
the same name in different classes. The warning's saved me a few
times before, but it's possible that there's a bug that's causing the
behaviour that you're seeing. If you can reproduce it in a new app we
could have a bug, but I don't think that's too likely given every
newly generated unit test does:

  test "the truth" do
    assert true
  end

Good point with... test "the truth"... I'll have to dig a bit more
because my test didn't seem to be replacing anything in the current
class.

Thanks

I've run into the opposite situation, where I was writing vanilla "def test_" stuff and trying to debug a particular case. Unfortunately, *somebody* had copied the whole header / setup from another test, so the test method was stomping on an identically named test... I'd recommend that you double-check the declarations in users_test.rb and forums_test.rb, as something weird is going on...

--Matt Jones

I've only experienced this issue when I made the mistake of copying
the class name from one test to another, and forgot to change it. e.g.

# file users_test.rb
class UsersTest < ActionController::IntegrationTest
  ...
end

#file forums_test.rb
class UsersTest < ActionController::IntegrationTest
  ...
end

When this mistake is made, it won't matter which form of test
definition you have. The testing framework will complain.
The other possibility is plugins/gems messing with your class names. I
can't think of any exact examples though.
Module inclusion should also NOT cause this.