rspec failing error: expected false to respond to `false?`

前端 未结 1 489
执念已碎
执念已碎 2020-12-09 15:43

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\         


        
相关标签:
1条回答
  • 2020-12-09 16:03

    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 and be_false to be_truthy and be_falsey. (Sam Phippen)

    0 讨论(0)
提交回复
热议问题