2013-09-30 97 views
0

我在使用rspec運行測試時遇到問題。在我的book.rb文件中,代碼塊通過了給它的所有測試,用於在書籍標題中大寫字(「殺死一隻模仿鳥」,「地獄」)。然而,當我從終端運行rake我反覆得到錯誤信息Rspec測試,ArgumentError:參數數量錯誤(0代表1)

"Failure/Error: @book.title.should == "Inferno" 
    ArgumentError: 
     wrong number of arguments (0 for 1)". 

我試圖改變PARAMS和刪除標題的方法,但沒有什麼工作,我仍然得到錯誤消息,即使該計劃大寫標題應該如此。謝謝,非常感謝任何幫助!

class Book 
    attr_accessor :title, :littlewords 

    def initialize 
    @littlewords = ["the", "a", "an", "and", "of", "in"] 
    end 

    def title 
    @title 
    end 

    def title(lit) 
    @title = '' 
    books = lit.split 
    books.each do |title| 
     title.capitalize! unless (littlewords.to_s).include?(title) 
    end 

    books[0] = books[0].upcase 
    books.first.capitalize! 
    books.join(' ') 
    end 
end 

s = Book.new 
puts s.title("to kill a mockingbird") 
puts s.title("inferno") 
+0

你的問題是,第二個'title'方法需要一個參數,覆蓋你的第一個'title'方法。我想你想'def title =(lit)',然後用's.title =「來殺死一隻模仿鳥」'同時,第一個'title'不需要,因爲你已經將它設置爲'attr_accessor' –

回答

0

在其他語言中,可以有多個名稱相同但帶有不同參數的方法。在這些語言中,它們實際上是兩種不同的方法。

Ruby不是那樣。

當你定義你的第二個方法,title,你實際上正在寫第一個方法title。所以,而不是兩個方法,一個接受一個參數,另一個不接受,你有一個方法接受一個參數。

所以,當你打電話給@book.title.should時,它正在調用期待參數的第二種方法。

首先,您不需要第一個方法title,因爲您在開始時將其設置爲attr_accessor。你可以免費獲得該方法。

所以,當你使用:

attr_accessor :title 

你得到:

def title 
    @title 
end 

def title=(value) 
    @title = value 
end 

所以,你想要做的是覆蓋該第二種方法。

attr_reader :title 

def title=(lit) 
    books = lit.split 
    books.each do |title| 
    title.capitalize! unless (littlewords.to_s).include?(title) 
    end 

    books[0] = books[0].upcase 
    books.first.capitalize! 
    @title = books.join(' ') 
end 

,您可以設置標題爲這樣:

​​3210

這也將使您的測試@book.title.should按預期運行。

相關問題