我正在运行这部分测试:
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?`
我对这个错误很困惑,因为它似乎给出了正确的答案。如果有人能花几分钟时间告诉我我的代码有什么问题,我真的很感激。 谢谢你。
答案 0 :(得分:72)
如果您浏览RSpec Expectations 2.99和RSpec 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.0 时,上面的方法名称已更改为 -
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>
现在,他们也在3.0.0.beta1 / 2013-11-07 changelog
中提到过将
be_true
和be_false
重命名为be_truthy
和be_falsey
。 (Sam Phippen)