Forum: Ruby Inheritance Question

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
7d38d23fe1ba0d2481445d5aa83d9b2b?d=identicon&s=25 David Solis (dsolis)
on 2006-03-23 21:37
Hello,

I'm having difficulty understanding inheritance in this case. In the
program below, I'm inheriting from <Test::Unit::TestCase. I also want my
other class in this program to inherit from <Test::Unit::TestCase. My
goal is to be able to make assertions in both classes.

If a run the program as written below, it works.

require 'test/unit'
require 'test/unit/ui/console/testrunner'

class TC_MyTest < Test::Unit::TestCase
  def test_myMethod
    puts 'test 1'
      assert(true, 'test 1')
    @test = TC_MyClass.new()
    @test_new = @test.test_myTestCase
  end
End

class TC_MyClass
  def initialize
  end
  def test_myTestCase
    puts 'test 2'
      #assert(true, 'test 2')
    puts 'test 3'
    puts 'test 4'
  end
end

But if try to do this, I get an error:

class TC_MyTest < Test::Unit::TestCase
  def test_myMethod
    puts 'test 1'
      assert(true, 'test 1')
    @test = TC_MyClass.new()
    @test_new = @test.test_myTestCase
  end
End

class TC_MyClass < Test::Unit::TestCase
  def initialize
  end
  def test_myTestCase
    puts 'test 2'
      assert(true, 'test 2')
    puts 'test 3'
    puts 'test 4'
  end
end
---------------------
c:/ruby/lib/ruby/1.8/test/unit/testcase.rb:51:in `initialize': wrong
number of arguments (1 for 0) (ArgumentError)
52a177e9dbd3e614825aabc4e45f8cd6?d=identicon&s=25 Mark Volkmann (Guest)
on 2006-03-23 21:46
(Received via mailing list)
On 3/23/06, David Solis <dsolis@yahoo.com> wrote:
> Hello,
>
> I'm having difficulty understanding inheritance in this case. In the
> program below, I'm inheriting from <Test::Unit::TestCase. I also want my
> other class in this program to inherit from <Test::Unit::TestCase.

There's no problem with having multiple classes in the same source
file inherit from some other class.

>     puts 'test 1'
>     puts 'test 2'
>     puts 'test 1'
>     puts 'test 2'
>       assert(true, 'test 2')
>     puts 'test 3'
>     puts 'test 4'
>   end
> end
> ---------------------
> c:/ruby/lib/ruby/1.8/test/unit/testcase.rb:51:in `initialize': wrong
> number of arguments (1 for 0) (ArgumentError)

You don't need the initialize method in TC_MyClass. Delete that and
see if it works.

There's still something strange going on here though. Why do you want
to put asserts in the class being tested? Normally all the asserts go
in the class doing the testing. Also, normally the classes being
tested and the test classes are in separate source files.
2ce7c81002a564e0e4139bc83d21f10a?d=identicon&s=25 unknown (Guest)
on 2006-03-23 21:49
(Received via mailing list)
This error is related to an earlier post.
Test::Unit::TestCase#initialize takes one argument.

require 'test/unit'

class FooTester < Test::Unit::TestCase
  def initialize(foo)
    super(foo)
  end
  def test_one
    assert(true)
  end
end

see the earlier post for a much better explination by Ross. :)

- Geoff
A9b6a93b860020caf9d2d1d58c32478f?d=identicon&s=25 Ross Bamford (Guest)
on 2006-03-23 22:09
(Received via mailing list)
On Fri, 2006-03-24 at 05:37 +0900, David Solis wrote:
> Hello,
>
> I'm having difficulty understanding inheritance in this case. In the
> program below, I'm inheriting from <Test::Unit::TestCase. I also want my
> other class in this program to inherit from <Test::Unit::TestCase. My
> goal is to be able to make assertions in both classes.

If all you want to do is make assertions, you could try something like:

require 'test/unit/assertions'

class MyClass
  include Test::Unit::Assertions

  def something(something_else)
    assert_equal 2, something_else.length
  end
end

Subclassing Test::Unit::TestCase will rarely work out well since I
believe Test::Unit automatically collects testcases and runs them before
ruby quits.
97cbca14d17274370cce501bbea7980a?d=identicon&s=25 Mike Harris (Guest)
on 2006-03-23 22:30
(Received via mailing list)
David Solis wrote:

>require 'test/unit/ui/console/testrunner'
>class TC_MyClass
>But if try to do this, I get an error:
>class TC_MyClass < Test::Unit::TestCase
>c:/ruby/lib/ruby/1.8/test/unit/testcase.rb:51:in `initialize': wrong
>number of arguments (1 for 0) (ArgumentError)
>
>
>
i know people already said this, but I'm saying it again cause it might
get lost in the noise.

remove the initialize method
B34a3aefcee5cca2fc2fbb59dd483467?d=identicon&s=25 Justin Rich (Guest)
on 2006-03-23 23:54
(Received via mailing list)
I noticed that removing the initialize method allows the tests to run.
Is there something in test /unit that requires an initialize
definition to have a certain interface?

-Justin
7d38d23fe1ba0d2481445d5aa83d9b2b?d=identicon&s=25 David Solis (Guest)
on 2006-03-24 02:37
Thanks Everybody for your help. So I did get it to work by removing the
initialize method with the classes in one source file. When I seperated
them into their own files, I got this message:

 C:/automation/src/thdf/projects/core/testharness/fixtures/admin_administration/test.rb:11:in
`test_myMethod'

1 tests, 1 assertions, 0 failures, 1 errors



I know some of you are wondering why I want to do this?

I'm writing automated scripts using Watir to drive a web app. The app
I'm testing has many repeatable steps. My goal is to break out the
repeatable patterns into it's own classes and call them as needed. I
need to be able to make assertions in the those classes. So when I
started to think about how I can do this, I came up with the program
above to see if this was possible. So far it's been touch and go.
This topic is locked and can not be replied to.