web-dev-qa-db-ja.com

rspec失敗エラー:「false?」に応答するためにfalseが期待されます

テストのこの部分を実行しています:

 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

このコードで:

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 

何が間違っているのかわかりませんが、テストが失敗し続け、次のように言っています。

> 1) Dictionary can check whether a given keyword exists
>      Failure/Error: @d.include?('fish').should be_false
>        expected false to respond to `false?`

それが正しい答えを与えているように見えるので、私はエラーで混乱しています。誰かが私のコードの何が問題なのか教えてくれるのに数分かかることがあれば本当にありがたいです。トンありがとうございます。

26
user3417583

RSpec Expectations 2.99RSpec Expectations 2.14 を閲覧し、セクション-真実と実存主義を検索すると、

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)
# ...............
# ...

しかし、あなたが閲覧した RSpec Expectations 3. 、上記のメソッド名は-に変更されました

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)
# ...........
#......

3.0で、このバージョンより前に存在していた方法を使用しているようです。したがって、エラーが発生していました。

以下のようにtest.rbファイルにコードを入れました:-

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

そして、私のspec/test_spec.rbファイルは-

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

今、私は自分のコンソールからコードを実行しています、そしてそれは機能します:

arup@linux-wzza:~/Ruby> rspec -v
2.14.8
arup@linux-wzza:~/Ruby> rspec spec
.

Finished in 0.00169 seconds
1 example, 0 failures

今私は私のspec/test_spec.rbファイルのコードを変更しています:-

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

そして再びテストを実行します:-

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>

さて、彼らは .0.0.beta1/2013-11-07 changelog にも言及しました

名前を変更するbe_trueおよびbe_falseからbe_truthyおよびbe_falsey。 (サム・フィッペン)

72
Arup Rakshit