Hi all, I''m having a bit of a problem with unit testing. I''ve
simplified my
models to try and get my head round it but I''m still struggling.
I''m using
STI and trying to write tests for the extended models (code below).
I''ve
written test cases for the extended models which themselves extend the test
case for the parent model, so BarTest extends FooTest which extends TestCase
when I run ''bar_test.rb'' it seems to run the test case twice,
once for
FooTest and once for BarTest, even though the only file I''m running is
bar_test.rb - here''s the output:
C:\WINDOWS\system32\cmd.exe /c ruby bar_test.rb
Loaded suite bar_test
Started
.Bar
.Foo
.
Finished in 0.109 seconds.
3 tests, 3 assertions, 0 failures, 0 errors
shouldn''t BarTest only have two tests? test_say_hi() which is inherited
from
FooTest and test_say_hello(), I don''t understand why the parent test
case is
also being run. Can anyone shed some light on this please?
thanks in advance
alan
code (also pasted to http://www.pasteserver.net/paste/show/152):
1 # model Foo, created using generator
2
3 class Foo < ActiveRecord::Base
4
5 def say_hi
6 "hi"
7 end
8
9 end
10
11 # model Bar, created manually and saved in bar.rb
12 class Bar < Foo
13
14 def say_hello
15 "hello"
16 end
17
18 end
19
20 # Test case for model Foo
21 require File.dirname(__FILE__) + ''/../test_helper''
22
23 class FooTest < Test::Unit::TestCase
24 fixtures :foos
25
26 def class_to_test
27 Foo
28 end
29
30 def test_say_hi
31 assert_equal "hi", class_to_test.new.say_hi
32
33 # debug
34 puts class_to_test
35 # end
36 end
37
38 end
39
40 # test case for model Bar, saved in bar_test.rb
41 #require File.dirname(__FILE__) + ''/../test_helper''
42
43 require File.dirname(__FILE__) + ''/foo_test''
44
45 class BarTest < FooTest
46
47 def class_to_test
48 Bar
49 end
50
51 def test_say_hello
52 assert_equal "hello", class_to_test.new.say_hello
53 end
54
55 endsql:CREATE TABLE `foos` ( `id` mediumint(9) NOT NULL
auto_increment, `type` varchar(255) default NULL, PRIMARY KEY (`id`))
ENGINE=InnoDB DEFAULT CHARSET=latin1;
Why not just have both BarTest and FooTest extend Test::Unit::TestCase class BarTest < Test::Unit::TestCase ... end class FooTest < Test::Unit::TestCase ... end That would seem to solve your problem. -Jonny -- Posted via http://www.ruby-forum.com/.
Alan Bullock wrote:> Hi all, I''m having a bit of a problem with unit testing. I''ve simplified my > models to try and get my head round it but I''m still struggling. I''m using > STI and trying to write tests for the extended models (code below). I''ve > written test cases for the extended models which themselves extend the test > case for the parent model, so BarTest extends FooTest which extends TestCase > > when I run ''bar_test.rb'' it seems to run the test case twice, once for > FooTest and once for BarTest, even though the only file I''m running is > bar_test.rb - here''s the output:My guess - and it''s only a guess - is that because BarTest requires FooTest to be loaded, and because FooTest appears to the test framework to be a valid test class, with a runnable test method, FooTest is getting run as well. Justin> > C:\WINDOWS\system32\cmd.exe /c ruby bar_test.rb > Loaded suite bar_test > Started > .Bar > .Foo > . > Finished in 0.109 seconds. > > 3 tests, 3 assertions, 0 failures, 0 errors > > > shouldn''t BarTest only have two tests? test_say_hi() which is inherited from > FooTest and test_say_hello(), I don''t understand why the parent test case is > also being run. Can anyone shed some light on this please? > > thanks in advance > alan > > code (also pasted to http://www.pasteserver.net/paste/show/152): > 1 # model Foo, created using generator > 2 > 3 class Foo < ActiveRecord::Base > 4 > 5 def say_hi > 6 "hi" > 7 end > 8 > 9 end > 10 > 11 # model Bar, created manually and saved in bar.rb > 12 class Bar < Foo > 13 > 14 def say_hello > 15 "hello" > 16 end > 17 > 18 end > 19 > 20 # Test case for model Foo > 21 require File.dirname(__FILE__) + ''/../test_helper'' > 22 > 23 class FooTest < Test::Unit::TestCase > 24 fixtures :foos > 25 > 26 def class_to_test > 27 Foo > 28 end > 29 > 30 def test_say_hi > 31 assert_equal "hi", class_to_test.new.say_hi > 32 > 33 # debug > 34 puts class_to_test > 35 # end > 36 end > 37 > 38 end > 39 > 40 # test case for model Bar, saved in bar_test.rb > 41 #require File.dirname(__FILE__) + ''/../test_helper'' > 42 > 43 require File.dirname(__FILE__) + ''/foo_test'' > 44 > 45 class BarTest < FooTest > 46 > 47 def class_to_test > 48 Bar > 49 end > 50 > 51 def test_say_hello > 52 assert_equal "hello", class_to_test.new.say_hello > 53 end > 54 > 55 endsql:CREATE TABLE `foos` ( `id` mediumint(9) NOT NULL > auto_increment, `type` varchar(255) default NULL, PRIMARY KEY (`id`)) > ENGINE=InnoDB DEFAULT CHARSET=latin1; > > > > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails > >
"Jonathan Viney" <jviney@spreydon.org.nz> wrote in message news:bdc7bbecc7fc363bc60b42b1c2289ae5@ruby-forum.com...> Why not just have both BarTest and FooTest extend Test::Unit::TestCase > > class BarTest < Test::Unit::TestCase > ... > end > > class FooTest < Test::Unit::TestCase > ... > end > > That would seem to solve your problem.wouldnt that mean having to write the same set of tests for both classes? BarTest should ideally test everything that FooTest does, and also any custom tests required for class Bar