2016-02-26 81 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