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
ybe_false
abe_truthy
ybe_falsey
. (Sam Phippen)