我试图在Ruby 1.9.1(Ubuntu Linux 12.04 64位)中使用测试单元做一个简单的测试用例:但它告诉我,我的TestCase的initialize方法缺少参数。当我进一步查看错误时,它告诉我它尝试启动/usr/lib/ruby/1.9.1/minitest。
但是,我之前安装了测试单元宝石。
这是第一个源文件: Run.rb
#!/usr/bin/env ruby
require "test/unit"
require_relative "NumbersSet.rb"
def draw_result
the_drawn_result = nil
loop do
the_drawn_result = rand(1000)
break if the_drawn_result >= 100
end
the_drawn_result
end
def do_operation(operation, number_1, number_2)
return nil if number_1 < 1 or number_2 < 1
number_1, number_2 = number_2, number_1 if number_1 < number_2
case operation
when :add
result = number_1 + number_2
return "#{number_1} + #{number_2} = #{result}", result
when :sub
return nil if number_1 == number_2 # A zero result will not help us
result = number_1 - number_2
return "#{number_1} - #{number_2} = #{result}", result
when :mul
return nil if number_1 == 1 or number_2 == 1 # Otherwise, this would be identity operation
result = number_1 * number_2
return "#{number_1} * #{number_2} = #{result}", result
when :div
return nil if number_1 == 1 or number_2 == 1 # Otherwise, this could be identity operation
return nil if number_1 % number_2 != 0
result = number_1 / number_2
return "#{number_1} / #{number_2} = #{result}", result
else
raise "Unknown operation #{operation} !"
end
end
def play
drawn_numbers = NumbersSet.draw
puts drawn_numbers.inspect, draw_result
end
class DrawTest < Test::Unit::TestCase
def draw_test
assert_equal(nil, do_operation(:add, -3, 1))
assert_equal(nil, do_operation(:add, 1, -1))
assert_equal(nil, do_operation(:add, 5, 0))
assert_equal(nil, do_operation(:add, 0, 5))
assert_equal(nil, do_operation(:add, 3, 5))
assert_equal(nil, do_operation(:add, 5, 3))
assert_equal(nil, do_operation(:sub, 5, 3))
assert_equal(nil, do_operation(:sub, 3, 5))
assert_equal(nil, do_operation(:sub, 3, 3))
assert_equal(nil, do_operation(:mul, 3, 5))
assert_equal(nil, do_operation(:mul, 5, 3))
assert_equal(nil, do_operation(:mul, 3, 1))
assert_equal(nil, do_operation(:mul, 1, 3))
assert_equal(nil, do_operation(:div, 20, 3))
assert_equal(nil, do_operation(:div, 3, 20))
assert_equal(nil, do_operation(:div, 20, 1))
assert_equal(nil, do_operation(:div, 1, 20))
assert_equal(nil, do_operation(:div, 20, 4))
assert_equal(nil, do_operation(:div, 5, 20))
end
end
OPERATIONS = [:add, :sub, :mul, :div]
DrawTest.new.draw_test
这是第二个文件:NumbersSet.rb
class NumbersSet
def self.draw
plaques = {}
(1..10).each { |value| plaques[value] = 2}
[25,50,75,100].each { |value| plaques[value] = 1}
draw_possibilities = (1..10).to_a << 25 << 50 << 75 << 100
the_draw = []
6.times do |loop_index|
drawn_number_index = nil
loop do
drawn_number_index = rand(draw_possibilities.size)
break if plaques[draw_possibilities[drawn_number_index]] > 0
end
the_draw << draw_possibilities[drawn_number_index]
plaques[draw_possibilities[drawn_number_index]] -= 1
end
the_draw
end
end
这就是终端错误:
$ ./Run.rb
/usr/lib/ruby/1.9.1/minitest/unit.rb:971:in `initialize': wrong number of arguments (0 for 1) (ArgumentError)
from ./Run.rb:77:in `new'
from ./Run.rb:77:in `<main>'
那么,这真的是我自己的编码或安装问题吗? 提前谢谢。
答案 0 :(得分:0)
我发现了什么变质:
在文件Run.rb中,我定义了我的TestCase子类:
所以这个源文件更好:
#!/usr/bin/env ruby
require "test/unit"
require_relative "NumbersSet.rb"
def draw_result
the_drawn_result = nil
loop do
the_drawn_result = rand(1000)
break if the_drawn_result >= 100
end
the_drawn_result
end
def do_operation(operation, number_1, number_2)
return nil if number_1 < 1 or number_2 < 1
number_1, number_2 = number_2, number_1 if number_1 < number_2
case operation
when :add
result = number_1 + number_2
return "#{number_1} + #{number_2} = #{result}", result
when :sub
return nil if number_1 == number_2 # A zero result will not help us
result = number_1 - number_2
return "#{number_1} - #{number_2} = #{result}", result
when :mul
return nil if number_1 == 1 or number_2 == 1 # Otherwise, this would be identity operation
result = number_1 * number_2
return "#{number_1} * #{number_2} = #{result}", result
when :div
return nil if number_1 == 1 or number_2 == 1 # Otherwise, this could be identity operation
return nil if number_1 % number_2 != 0
result = number_1 / number_2
return "#{number_1} / #{number_2} = #{result}", result
else
raise "Unknown operation #{operation} !"
end
end
def play
drawn_numbers = NumbersSet.draw
puts drawn_numbers.inspect, draw_result
end
class DrawTest < Test::Unit::TestCase
def test_draw
assert_equal(nil, do_operation(:add, -3, 1))
assert_equal(nil, do_operation(:add, 1, -1))
assert_equal(nil, do_operation(:add, 5, 0))
assert_equal(nil, do_operation(:add, 0, 5))
assert_equal(nil, do_operation(:sub, -3, 1))
assert_equal(nil, do_operation(:sub, 1, -1))
assert_equal(nil, do_operation(:sub, 5, 0))
assert_equal(nil, do_operation(:sub, 0, 5))
assert_equal(nil, do_operation(:mul, -3, 1))
assert_equal(nil, do_operation(:mul, 1, -1))
assert_equal(nil, do_operation(:mul, 5, 0))
assert_equal(nil, do_operation(:mul, 0, 5))
assert_equal(nil, do_operation(:div, -3, 1))
assert_equal(nil, do_operation(:div, 1, -1))
assert_equal(nil, do_operation(:div, 5, 0))
assert_equal(nil, do_operation(:div, 0, 5))
assert_equal(nil, do_operation(:add, 3, 5))
assert_equal(nil, do_operation(:add, 5, 3))
assert_equal(nil, do_operation(:sub, 5, 3))
assert_equal(nil, do_operation(:sub, 3, 5))
assert_equal(nil, do_operation(:sub, 3, 3))
assert_equal(nil, do_operation(:mul, 3, 5))
assert_equal(nil, do_operation(:mul, 5, 3))
assert_equal(nil, do_operation(:mul, 3, 1))
assert_equal(nil, do_operation(:mul, 1, 3))
assert_equal(nil, do_operation(:div, 20, 3))
assert_equal(nil, do_operation(:div, 3, 20))
assert_equal(nil, do_operation(:div, 20, 1))
assert_equal(nil, do_operation(:div, 1, 20))
assert_equal(nil, do_operation(:div, 20, 4))
assert_equal(nil, do_operation(:div, 5, 20))
end
end
OPERATIONS = [:add, :sub, :mul, :div]