ruby - LocalJumpError: no block given -
i keep getting error while running rspec file:
failures: 1) book title should capitalize first letter failure/error: @book.title("inferno") localjumperror: no block given (yield) # ./08_book_titles.rb:7:in `title'
here book_title.rb
class :: book attr_accessor :some_title def title(some_title) little_words = %w(of , on under or nor yet @ around after along on without) some_title = yield some_title.split.each_with_index.map{|x, index| little_words.include?(x) && index > 0 ? x : x.capitalize }.join(" ") end #def end
and here rspec file (or @ least first spec):
require_relative '08_book_titles' describe book before @book = book.new end describe 'title' 'should capitalize first letter' @book.title("inferno") @book.title.should == "inferno" end end
i have included yield in method, , there block in spec...so don't understand why not calling block. have tried think of calling directly on map (instead of using variable assigned to) calling separately on own using on map, trying pass in argument of title in method...to see now. have read through ton of threads. not seeing?
i see future exercises running specs on custom classes love tips (or links) on things need know or out while testing custom classes rspec. thanks!
updated
so have changed book_title.rb this:
class :: book def title little_words = %w(of , on under or nor yet @ around after along on without) self.split.each_with_index.map{|x, index| little_words.include?(x) && index > 0 ? x : x.capitalize }.join(" ") end #def end
and because i, incorrectly, edited specs- reverted them this:
require '08_book_titles' describe book before @book = book.new end describe 'title' 'should capitalize first letter' @book.title = "inferno" @book.title.should == "inferno" end end
and error this:
failure/error: @book.title = "inferno" nomethoderror: undefined method `title=' #<book:0x007f292a06c6b0> # ./08_book_titles_spec.rb:26:in `block (3 levels) in <top (required)>'
you're mis-using yield
, no, there's no block in spec. if there was, spec like...
@book.title("inferno") "inferno" end
see block added? don't need block , shouldn't use yield
you seem thinking need yield
access argument... don't. title
method should use passed argument directly...
def title(new_title) little_words = %w(of , on under or nor yet @ around after along on without) @some_title = new_title.split.each_with_index.map{|x, index| little_words.include?(x) && index > 0 ? x : x.capitalize }.join(" ") end #def
finally, test calling title
method twice, when should call once , use attr_accessor method test result.
it 'should capitalize first letter' @book.title("inferno") @book.some_title.should == "inferno" end