在Rspec中,我正在尝试测试函数的近似返回值。
我定义了以下内容:
def approx_equals(val, expected, perc_error_accepted)
margin = (expected * perc_error_accepted / 100)
return val >= expected - margin && val <= expected + margin
end
现在我想以这种方式测试我的功能:
describe Foo do
context "comparing return values" do
expect(approx_equals(obj.datas[:bar], 500, 10)).to eq(true)
end
end
但我收到以下错误:undefined method 'expect' for #<Class:0x3cf5340> (NoMethodError)
我也尝试了以下内容:
describe Foo do
context "comparing return values" do
approx_equals(obj.datas[:bar], 500, 10).should == true
end
end
但是如果发生故障,rspec会停止执行,这对我来说不是一个好的解决方案。
我做错了什么?
答案 0 :(得分:3)
context
中的{p> RSpec
不是测试,它们只是describe
的别名。将代码放在it
块中,它会起作用。
describe Foo do
it "compares return values" do
expect(approx_equals(obj.datas[:bar], 500, 10)).to eq(true)
end
end
修改强>
此外,你应该像这样使用RSpec匹配器:
expect(approx_equals(obj.datas[:bar], 500, 10)).to be_true
它会在失败时为您提供更好的输出。
在RSpec3上,匹配器已从be_true
更改为be true
答案 1 :(得分:1)
您的测试应位于it {}
块内。即:
describe Foo do
context "comparing return values" do
it { approx_equals(obj.datas[:bar], 500, 10).should == true }
end
end
提供更多信息
答案 2 :(得分:0)
如果你想做一些be_boolean我认为方法是将rspec_boolean添加到组中的Gemfile:development,:test:
gem&#39; rspec_boolean&#39;
而且你可以在测试中使用be_boolean
实施例: expect(val.is_done?)。to be_boolean