Dynamically add a method to a TestCase

A

Achim Domma

Hi,

I'm experimenting with the dynamic features of ruby to add methods to
a TestCase. Here is my test script:

require 'watir'
require 'test/unit'

class MyTest < Test::Unit::TestCase
end

for num in ["a","b","c"]
MyTest.send:)define_method,"test_" + num) {
assert(false,"->"+num)
}
end

It works fine so far, but all asserts display "->c" as error message.
I don't understand why! Any hint? How to fix it?

regards,
Achim
 
J

Jason Roelofs

[Note: parts of this message were removed to make it a legal post.]

Hi,

I'm experimenting with the dynamic features of ruby to add methods to
a TestCase. Here is my test script:

require 'watir'
require 'test/unit'

class MyTest < Test::Unit::TestCase
end

for num in ["a","b","c"]
MyTest.send:)define_method,"test_" + num) {
assert(false,"->"+num)
}
end

It works fine so far, but all asserts display "->c" as error message.
I don't understand why! Any hint? How to fix it?

regards,
Achim

That's exactly what you're telling assert to do. Method definition is
something like:

assert(expression, error_message = nil)

What exactly are you wanting to do?

Jason
 
J

Jason Roelofs

[Note: parts of this message were removed to make it a legal post.]

Hi,

I'm experimenting with the dynamic features of ruby to add methods to
a TestCase. Here is my test script:

require 'watir'
require 'test/unit'

class MyTest < Test::Unit::TestCase
end

for num in ["a","b","c"]
MyTest.send:)define_method,"test_" + num) {
assert(false,"->"+num)
}
end

It works fine so far, but all asserts display "->c" as error message.
I don't understand why! Any hint? How to fix it?

regards,
Achim

That's exactly what you're telling assert to do. Method definition is
something like:

assert(expression, error_message = nil)

What exactly are you wanting to do?

Jason
Dah crap, excuse my previous email. I need to work on my reading
comprehension.

That is odd. I would assume that a puts there would always say "c", though
it can't hurt to try.

Jason
 
J

Joel VanderWerf

Achim said:
Hi,

I'm experimenting with the dynamic features of ruby to add methods to
a TestCase. Here is my test script:

require 'watir'
require 'test/unit'

class MyTest < Test::Unit::TestCase
end

for num in ["a","b","c"]
MyTest.send:)define_method,"test_" + num) {
assert(false,"->"+num)
}
end

It works fine so far, but all asserts display "->c" as error message.
I don't understand why! Any hint? How to fix it?

It's the way the 'for' construct scopes the 'num' variable. All three
method definition blocks are seeing 'num' in the same scope, so they all
get the last assigned value, "c".

Try this:

procs = []
for num in ["a","b","c"]
#["a","b","c"].each do |num|
procs << proc {
num
}
end

procs.each do |pr|
puts pr.call
end

That prints three 'c's.

Now uncomment the 'each' line and comment out the 'for' line, and you'll
see the scope difference!
 
M

Morton Goldberg

Hi,

I'm experimenting with the dynamic features of ruby to add methods to
a TestCase. Here is my test script:

require 'watir'
require 'test/unit'

class MyTest < Test::Unit::TestCase
end

for num in ["a","b","c"]
MyTest.send:)define_method,"test_" + num) {
assert(false,"->"+num)
}
end

It works fine so far, but all asserts display "->c" as error message.
I don't understand why! Any hint? How to fix it?


One way to fix it is to use eval rather then send:

<code>
require 'test/unit'

class MyTest < Test::Unit::TestCase
for ch in %w[a b c]
eval %[define_method("test_#{ch}") { assert(false, "->#{ch}") }]
end
end
</code>

Regards, Morton
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,065
Latest member
OrderGreenAcreCBD

Latest Threads

Top