Mixing Rake and Turn

Hi all,

I’ve got some test tasks that I’ve got setup via a Rakefile. I’d like
to see the output in the ‘turn’ format. However, simply sticking
‘require “turn”’ at the top of the Rakefile doesn’t quite do the
trick:

rake test_foo
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake/
rake_test_loader
Started

Finished in 0.440434 seconds.

249 tests, 738 assertions, 0 failures, 0 errors
Loaded suite /usr/local/bin/rake

pass: 0, fail: 0, error: 0
total: 0 tests with 0 assertions in 0.001122 seconds

So, it’s giving me the nicer summary, but not the line by line result
for each test.

How do I get Rake to behave the way I want?

Thanks,

Dan

On 2/2/07, Daniel B. [email protected] wrote:

Started
So, it’s giving me the nicer summary, but not the line by line result
for each test.

How do I get Rake to behave the way I want?

When you run your unit tests from within rake, they are actually run
in a separate ruby interpreter. Requiring turn into the Rakefile does
not require turn into the ruby interpreter where the unit tests are
run.

You’ll have to modify your test task to include turn …

ruby -Ilib -rturn your/test.rb

Or use the turn command

turn -Ilib your/test.rb

The fancy turn summary is coming out of the ruby interpreter running
rake. When you require ‘turn’ the test::unit library is also
included. test::unit sets up an empty test suite by default and
registers a teardown hook. If no tests are run by the time the
interpreter exits, the teardown hook is invoked and the empty test
suite is run (hence the empty result set).

Hope this explanation helps.

Blessings,
TwP

On Feb 2, 3:40 pm, “Tim P.” [email protected] wrote:

pass: 0, fail: 0, error: 0
not require turn into the ruby interpreter where the unit tests are
The fancy turn summary is coming out of the ruby interpreter running
rake. When you require ‘turn’ the test::unit library is also
included. test::unit sets up an empty test suite by default and
registers a teardown hook. If no tests are run by the time the
interpreter exits, the teardown hook is invoked and the empty test
suite is run (hence the empty result set).

Hope this explanation helps.

Thanks Tim, it does.

In theory, then, I ought to be able to push “-rturn” onto the
TestTask#ruby_opts accessor. Unfortunately, there appears to be a bug
in Rake where the @ruby_opts instance variable is getting reset to an
empty array inside the “define” method in testtask.rb.

I’ll bring that up on the Rake mailing list.

Regards,

Dan

Daniel B. wrote:

end
But you have now a dependency to turn. If you share your program with
others they have to install turn if they want to use the test task. :frowning:

I prefer at the moment the following snipped on top of every test file:

require ‘test/unit’
begin
require ‘turn’
rescue LoadError; end

So you can running tests with or without turn installed.

Other ideas?

Regards,
Jan

On Feb 2, 4:09 pm, “Daniel B.” [email protected] wrote:

‘require “turn”’ at the top of the Rakefile doesn’t quite do the
Loaded suite /usr/local/bin/rake
When you run your unit tests from within rake, they are actually run
turn -Ilib your/test.rb
Thanks Tim, it does.
Dan
Upon further review, using TestTask#ruby_opts does work. The bug was
mine.

Anyhoo, for the sake of future Googlers, this is how you do it:

desc “Runs the test suite for the Foo class”
Rake::TestTask.new(‘test_foo’) do |t|
t.test_files = FileList[‘test/foo/*.rb’] # Or whatever
t.ruby_opts << ‘-rturn’
t.warning = true
end

Regards,

Dan

On Feb 3, 5:40 am, Jan F. [email protected] wrote:

t.warning = true
rescue LoadError; end

So you can running tests with or without turn installed.

Other ideas?

In one project I have way too many files for that to be feasible. A
simpler approach would be to do this at the top of the Rakefile:

$turn = true
begin
require ‘turn’
rescue LoadError
$turn = false
end

t.ruby_opts << ‘-rturn’ if $turn

The only problem with that is that, as Tim mentioned earlier, you’ll
get the bogus “zero” test results at the end (in addition to the real
results). To avoid that, we could check to see if the turn.rb file
merely exists instead of actually loading it:

require ‘rbconfig’
include Config

$turn = false
$turn = true if File.exists?(File.join(CONFIG[‘sitelibdir’],
‘turn.rb’))

t.ruby_opts << ‘-rturn’ if $turn

This is what I plan on doing.

Regards,

Dan

Daniel B. wrote:

t.ruby_opts << ‘-rturn’
This doesn’t work if you have installed turn via rubygems:

/usr/bin/ruby1.8: no such file to load – turn (LoadError)
rake aborted!

You cannot load gems with the -r option of the ruby interpreter.

Regards,
Jan

On Feb 5, 2007, at 10:17 AM, Tim P. wrote:

t.ruby_opts << ‘-rubygems’
t.ruby_opts << ‘-rturn’

That should work, correct?

No, I don’t think so.

Ruby’s -r switch is not implemented by calling Ruby’s require()
method, so RubyGems cannot override it.

James Edward G. II

On 2/5/07, Jan F. [email protected] wrote:

Daniel B. wrote:

t.ruby_opts << ‘-rturn’
This doesn’t work if you have installed turn via rubygems:

/usr/bin/ruby1.8: no such file to load – turn (LoadError)
rake aborted!

You cannot load gems with the -r option of the ruby interpreter.

t.ruby_opts << ‘-rubygems’
t.ruby_opts << ‘-rturn’

That should work, correct?

TwP