2008-09-22 7 views
3

Я пытаюсь отполировать свой Ruby, написав пример XUnit Python Кента Бэка из «Test Driven Development: By Example». У меня довольно далеко, но теперь я получаю следующую ошибку, когда я запускаю ее, которую я не забегаю.Почему я получаю исключение «неправильное количество аргументов (0 для 2)» в моем Ruby-коде?

C:\Documents and Settings\aharmel\My Documents\My Workspace\TDD_Book\TDDBook_xUnit_RubyVersion\lib\main.rb:21:in `test_running': wrong number of arguments (0 for 2) (ArgumentError) 
    from C:\Documents and Settings\aharmel\My Documents\My Workspace\TDD_Book\TDDBook_xUnit_RubyVersion\lib\main.rb:21:in `run' 
    from C:\Documents and Settings\aharmel\My Documents\My Workspace\TDD_Book\TDDBook_xUnit_RubyVersion\lib\main.rb:85 

Мой код выглядит следующим образом:

class TestCase 
    def initialize(name) 
    puts "1. inside TestCase.initialise: @name: #{name}" 
    @name = name 
    end 
    def set_up 
    # No implementation (but present to be overridden in WasRun) 
    end 
    def run 
    self.set_up 
    self.send @name # <<<<<<<<<<<<<<<<<<<<<<<<<= ERROR HERE!!!!!! 
    end 
end 

class WasRun < TestCase 
    attr_accessor :wasRun 
    attr_accessor :wasSetUp 

    def initialize(name) 
    super(name) 
    end 
    def set_up 
    @wasRun = false 
    @wasSetUp = true 
    end 
    def test_method 
    @wasRun = true 
    end 
end 

class TestCaseTest < TestCase 
    def set_up 
    @test = WasRun.new("test_method") 
    end 
    def test_running 
    @test.run 
    puts "test was run? (true expected): #{test.wasRun}" 
    end 
    def test_set_up 
    @test.run 
    puts "test was set up? (true expected): #{test.wasSetUp}" 
    end 
end 

TestCaseTest.new("test_running").run 

Можно ли указать свою очевидную ошибку?

ответ

11

Это ваш оператор печати:

puts "test was run? (true expected): #{test.wasRun}" 

должен быть

puts "test was run? (true expected): #{@test.wasRun}" 

без '@' вы вызываете Kernel # тест, который ожидает 2 переменных.

+0

Да, это должно сделать это. Я попробовал, и он работает так, как ожидалось. – 2008-09-22 20:00:45

0

Одна вещь, которая выпрыгивает, заключается в том, что метод send ожидает символ, идентифицирующий имя метода, но вы пытаетесь использовать переменную экземпляра.

Object.send documentation

Кроме того, следует не линии, как это:

puts "test was run? (true expected): #{test.wasRun}" 

быть:

puts "test was run? (true expected): #{@test.wasRun}" 

?

+0

Send принимает как строки, так и символы, а в его случае переменная экземпляра содержит нужную ему строку. Это прекрасно :-) – 2008-09-23 04:06:23