with tests run rails how effective describe ruby rspec rspec3

ruby - tests - rspec rails 5



Error de error de rspec: ¿se espera que falso responda a `falso?` (1)

Estoy ejecutando esta parte de una prueba:

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

Con este código:

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

No sé qué estoy haciendo mal, pero mis pruebas siguen fallando y diciendo esto:

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

Estoy confundido por el error, ya que parece estar dando la respuesta correcta. Realmente apreciaría si alguien pudiera tomarme unos minutos para decirme qué está mal con mi código. Gracias toneladas


Si navega por RSpec Expectations 2.99 y RSpec Expectations 2.14 y busca en la sección - Verdad y existencialismo , encontrará

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

Pero a medida que navega por RSpec Expectations 3.0 , los nombres de los métodos anteriores se cambiaron a

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

Parece que estás en 3.0 , y usando el método que existía antes de esta versión. Por lo tanto, estaba recibiendo el error.

Pongo el código en mi archivo test.rb de la siguiente manera:

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

Y mi archivo spec / test_spec.rb es -

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

Ahora estoy ejecutando el código desde mi consola, y funciona:

arup@linux-wzza:~/Ruby> rspec -v 2.14.8 arup@linux-wzza:~/Ruby> rspec spec . Finished in 0.00169 seconds 1 example, 0 failures

Ahora estoy cambiando el código en mi archivo 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

y de nuevo ejecuta la prueba: -

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>

Ahora, también se mencionan en el changelog 3.0.0.beta1 / 2013-11-07

Cambie el nombre de be_true y be_false a be_truthy y be_falsey . (Sam Phippen)