2016-02-17 77 views
1

我正在鍛鍊exerciseism.io。這是在規格文件中要求:Minitest錯誤 - ArgumentError:錯誤的參數數量(給定1,預期0)

  1. Hello World!程序將迎接我,呼叫者。
  2. 如果我告訴程序我的名字是愛麗絲,它會通過說「你好,愛麗絲!」來迎接我。
  3. 如果我沒有說出我的名字,它會問我說:「你好,世界!」

class HelloWorldTest < Minitest::Test 
    def test_no_name 
    assert_equal 'Hello, World!', HelloWorld.hello 
    end 

    def test_sample_name 
    assert_equal 'Hello, Alice!', HelloWorld.hello('Alice') 
    end 

    def test_other_sample_name 
    assert_equal 'Hello, Bob!', HelloWorld.hello('Bob') 
    end 
end 

這是我的計劃:

class HelloWorld 
    def self.hello 
    "Hello, World!" 
    end 

    def initialize(name) 
    @name = name 
    end 

    def say_hello 
    puts "Hello, #{@name}!" 
    end 
end 

print "Give me your name: " 
your_name = gets.chomp 
hello = HelloWorld.new(your_name) 
if your_name == "" 
    puts "Hello, World!" 
else 
    hello.say_hello 
end 

程序運行,並滿足所有的要求,但我得到的錯誤:

1) Error: 
HelloWorldTest#test_sample_name: 
ArgumentError: wrong number of arguments (given 1, expected 0) 
    /Users/drempel/exercism/ruby/hello-world/hello_world.rb:3:in `hello' 
    hello_world_test.rb:24:in `test_sample_name' 

3 runs, 1 assertions, 0 failures, 1 errors, 1 skips 

我如何定義一個不需要參數的方法?

回答

1

有時在測試你說

HelloWorld.hello('Alice') 

在測試其他時候你說

HelloWorld.hello 

所以你打電話方法「你好」有和沒有參數。

要使參數可選,您可以給它們一個默認值。

def self.hello(name_to_use=nil) 
    if name_to_use 
    "Hello, #{name_to_use}!" 
    else 
    "Hello, World!" 
    end 
end 
+0

這是我一直在尋找的解決方案。謝謝!所有三個斷言都通過了。我正在掛上Minitest的輸出文字。 –

+0

正確,所以從測試中學習如何使用和不使用參數調用相同的方法,這是一個很好的學習。你的解決方案中大多數你不需要(目前)...初始化和'say_hello'以及創建新對象。通常最好不要編碼,直到你需要它通過測試。 – SteveTurczyn

+0

這很有道理,謝謝史蒂夫。根據我目前的經驗,這是我覺得我可以完成目標的唯一途徑。爲參數定義一個默認值很有意義! –

2

How do I define a method that doesn't require arguments?

你的問題恰恰相反。您正在向方法HelloWorld.hello傳遞參數,該方法不帶參數。

您的測試代碼與您的源代碼所做的不匹配。要麼改變你的源代碼:

class HelloWorld 
    def self.hello(name = "World") 
    "Hello, #{name}!" 
    end 
end 

這裏,name = "World"表明name參數是可選的,默認值是"World"

或者改變你的測試:

assert_equal 'Hello, Alice!', HelloWorld.new('Alice').say_hello 
assert_equal 'Hello, Bob!', HelloWorld.new('Bob').say_hello 
+0

對不起,我應該提到這個網站的目的是幫助你練習Ruby。我只是一個初學者。這有助於我習慣TDD。因此,您從練習中提供的測試開始,然後編寫一個程序來滿足該測試。 –

+0

好的,我爲你解答了這個問題。 – sawa

+1

這也很棒。謝謝!你的例子對我來說更容易纏繞我的頭。爲世界指定一個默認值是有道理的。 –

0

How do I define a method that doesn't require arguments?

理解的錯誤消息意味着什麼是很重要的,因爲我對Learn.co的Object-Oriented TicTacToe challenge類似的問題。當您的代碼針對測試代碼運行時,測試代碼將'Alice'的一個參數「提供給」#self.hello方法。但你寫的#self.hello方法期望完全沒有參數。因此:

ArgumentError: wrong number of arguments (given 1, expected 0) 
/Users/drempel/exercism/ruby/hello-world/hello_world.rb:3:in `hello' 
hello_world_test.rb:24:in `test_sample_name' 

我的錯誤信息是相似的,我有思想的火車一樣:「如果預期的0,我該怎麼給它0?」很明顯,從我們的經驗中獲得一個關鍵的東西就是更好地理解錯誤信息的含義。

相關問題