0

在 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 在失败的情况下停止执行,所以这对我来说不是一个好的解决方案。

我究竟做错了什么?

4

3 回答 3

3

contextinRSpec不是测试,它们只是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_truebe true

于 2013-09-27T13:54:55.500 回答
1

您的测试应该在一个it {}块内。IE:

describe Foo do
    context "comparing return values" do
        it { approx_equals(obj.datas[:bar], 500, 10).should == true }
    end
end

项目文档中提供了更多信息

于 2013-09-27T13:54:46.113 回答
0

如果你想做一些事情作为 be_boolean 我认为方法是将 rspec_boolean 添加到组中的 Gemfile :development, :test:

宝石'rspec_boolean'

而且您可以在测试中使用 be_boolean

示例:expect(val.is_done?).to be_boolean

于 2015-09-16T07:49:01.200 回答