2016-02-26 4 views
1

Я пытаюсь передать эту RspecTrouble проходя через 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. (например, он просто возвращается как «stuart little»).

Я полностью смущен, почему это происходит, поэтому я надеюсь, что кто-то может пролить свет на меня.

ответ

1

Вы используете только свой capital метод, когда вы назначаете заголовок методу new, но не тогда, когда вы назначаете его методу set title=.

Я хотел бы заменить attr_accessor с attr_reader и добавить пользовательский метод title= сеттера:

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 не достаточно для сеттера, что вам нужен титульный = сеттер метод? (и спасибо за ответ!) – Stephanie

+0

@Stephanie: 'attr_accessor' генерирует простой сеттер, например' @title = title'. Если бы вы использовали этот метод, он бы не назвал ваш метод 'capital', он просто присвоил бы строку, не предварительно заглавную. Но если вы используете пользовательский метод 'title =' из моего ответа, он назначит строку изменения: '@title = capital (title)'. – spickermann

+0

Это намного больше смысла! Спасибо! – Stephanie