I am running this portion of a test:
describe Dictionary do before do @d = Dictionary.new end it 'can check whether a given keyword exists' do @d.include?('fish').should be_false end
With this code:
class Dictionary def initialize @hash = {} end def add(new_entry) new_entry.class == String ? @hash[new_entry] = nil : new_entry.each { |noun, definition| @hash[noun] = definition} end def entries @hash end def keywords @hash.keys end def include?(word) if @hash.has_key?(word) true else false end end end
I don't know what I'm doing wrong, but my tests keep failing and saying this:
> 1) Dictionary can check whether a given keyword exists > Failure/Error: @d.include?('fish').should be_false > expected false to respond to `false?`
I am confused at the error since it seems to be giving the correct answer. I would really appreciate if someone could take a few minutes to tell me what's wrong with my code. Thank you tons.
If you browse the RSpec Expectations 2.99 and RSpec Expectations 2.14 and search the section - Truthiness and existentialism, you will find
expect(actual).to be_true # passes if actual is truthy (not nil or false) expect(actual).to be_false # passes if actual is falsy (nil or false) # ............... # ...
But of you browse RSpec Expectations 3.0 , the above method names got changed to -
expect(actual).to be_truthy # passes if actual is truthy (not nil or false) expect(actual).to be true # passes if actual == true expect(actual).to be_falsey # passes if actual is falsy (nil or false) # ........... #......
It seems you are in 3.0, and using the method which were exist prior to this version. Thus you were getting the error.
I put the code in my test.rb file as below :-
class Dictionary def initialize @hash = {} end def add(new_entry) new_entry.class == String ? @hash[new_entry] = nil : new_entry.each { |noun, definition| @hash[noun] = definition} end def entries @hash end def keywords @hash.keys end def include?(word) if @hash.has_key?(word) true else false end end end
And my spec/test_spec.rb file is -
require_relative "../test.rb" describe Dictionary do before do @d = Dictionary.new end it 'can check whether a given keyword exists' do @d.include?('fish').should be_false end end
Now I am running the code from my console, and it works :
arup@linux-wzza:~/Ruby> rspec -v 2.14.8 arup@linux-wzza:~/Ruby> rspec spec . Finished in 0.00169 seconds 1 example, 0 failures
Now I am changing the code in my spec/test_spec.rb file :-
require_relative "../test.rb" describe Dictionary do before do @d = Dictionary.new end it 'can check whether a given keyword exists' do @d.include?('fish').should be_falsey end end
and again run the test :-
arup@linux-wzza:~/Ruby> rspec -v 2.14.8 arup@linux-wzza:~/Ruby> rspec spec F Failures: 1) Dictionary can check whether a given keyword exists Failure/Error: @d.include?('fish').should be_falsey NoMethodError: undefined method `falsey?' for false:FalseClass # ./spec/test_spec.rb:9:in `block (2 levels) in <top (required)>' Finished in 0.00179 seconds 1 example, 1 failure Failed examples: rspec ./spec/test_spec.rb:8 # Dictionary can check whether a given keyword exists arup@linux-wzza:~/Ruby>
Now, they also mentioned in the 3.0.0.beta1 / 2013-11-07 changelog
Rename
be_true
andbe_false
tobe_truthy
andbe_falsey
. (Sam Phippen)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With