2013-09-30 3 views
0

У меня возникли проблемы с запуском теста с использованием rspec. В моем файле book.rb блок кода передает все тесты, предоставленные ему для заглавных слов в заголовках книг («убить пересмешника», «ад»). Тем не менее, когда я запускаю грабли от терминала я неоднократно получаю сообщение об ошибке,Rspec testing, 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 

Таким образом, вы можете установить заголовки, как например:

s = Book.new 
puts s.title = "to kill a mockingbird" #=> "To Kill a Mockingbird" 
puts s.title = "inferno" #=> "Inferno" 

Это также позволит тест @book.title.should работать, как ожидалось.

 Смежные вопросы

  • Нет связанных вопросов^_^