Came across a minor oversight in a Ruby example on pg 49 of Programming Ruby. The test code checks that you can find a song in a list which is just wrapped into an array of song objects. It worked find until I used a negative test case to search for a song title that shouldn’t be in the list.
def testFindBySongTitle
assert_equal(@song1, @song_list.with_title("Love Song"))
assert_nil(@song_list.with_title("love song"))
end
I got the familiar red bar and an error
|
1
|
Exception: undefined method 'name' for nil:NilClass
|
. So I stared at the code for a bit looking for something funky:
class SongList
def with_title(title)
for i in 0..@songs.length
return @songs[i] if title == @songs[i].name
end
return nil
end
end
As it turned out I noticed it was actually iterating over the length of the array and since Ruby arrays are zero based indexes, I really needed to add the familiar
|
1
|
length -1
|
.
class SongList
def with_title(title)
for i in 0..@songs.length - 1
return @songs[i] if title == @songs[i].name
end
return nil
end
end
So once again a negative test case came in handy. I went ahead and submitted it as possible errata.