2016-02-26 38 views
1

我想通過這個rspec的麻煩經過rspec的

describe "title" do 
it "should capitalize the first letter" do 
    @book.title = "inferno" 
    expect(@book.title).to eq("Inferno") 
end 

it "should capitalize every word" do 
    @book.title = "stuart little" 
    expect(@book.title).to eq("Stuart Little") 
end 

有了這個代碼

class Book 
    attr_accessor :title 

    def initialize(title="") 
    @title = capital(title) 
    end 

    def capital(title) 
    articles = %w(the a an and of in the) 
    new_title = [] 

    title.split.each do |w| 
     articles.include?(w)? new_title << w : new_title << w.capitalize 
     end 

    new_title[0] = new_title[0].capitalize 
    new_title.join(" ") 
    end 

end 

book = Book.new("stuart little") 
puts book.title 

我也得到「精靈鼠小弟」,當我運行的代碼,但我不斷收到錯誤當我通過rspec運行它時。 (例如,它只是作爲「斯圖特小」返回)。

我很困惑爲什麼會發生這種情況,所以我希望有人能爲我揭開一些光。

回答

1

當您爲new方法分配標題時,只有在將其分配給title=設置方法時,纔會運行capital方法。

我將取代attr_accessorattr_reader並添加自定義title= setter方法:

class Book 
    attr_reader :title 

    def initialize(title = '') 
    self.title = title # calls the setter below 
    end 

    def title=(title) 
    @title = capital(title) 
    end 

private 

    def capital(string) 
    articles = %w(a an and in of the) 

    words = title.split.map do |word| 
     articles.include?(word) ? word : w.capitalize 
    end 

    words.join(' ').capitalize 
    end 
end 
+0

對不起,我的所有問題,但爲什麼是attr_accessor不夠的,你需要一個標題= setter方法二傳手? (並感謝您的回答!) – Stephanie

+0

@Stephanie:'attr_accessor'生成一個簡單的setter,比如'@title = title'。如果你使用這種方法,它不會調用你的'大寫'方法,它只會分配字符串而不被大寫。但是如果你在我的答案中使用自定義的'title ='方法,它會分配改變字符串:'@title = capital(title)'。 – spickermann

+0

這樣做更有意義!謝謝! – Stephanie