如何使用RSpec测试无效参数引发ArgumentError异常?

时间:2010-05-16 09:54:03

标签: ruby rspec

如果提供给它的单个方法的参数无效,我正在编写一个可以引发ArgumentError的RubyGem。如何使用RSpec为此编写测试?

以下示例显示了我想到的实现方式。 bar方法需要一个布尔参数(:baz),检查其类型以确保它实际上是一个布尔值:

module Foo
  def self.bar(options = {})
    baz = options.fetch(:baz, true)
    validate_arguments(baz)
  end

  private
  def self.validate_arguments(baz)
    raise(ArgumentError, ":baz must be a boolean") unless valid_baz?(baz)
  end

  def self.valid_baz?(baz)
    baz.is_a?(TrueClass) || baz.is_a?(FalseClass)
  end
end

3 个答案:

答案 0 :(得分:28)

我使用类似于JHurra发布的内容:

it "should raise ArgumentError for arguments that are not boolean" do
  expect{ Foo.validate_arguments(nil) }.to raise_error(ArgumentError)
end

无需别名(rspec 1.3)。

答案 1 :(得分:3)

it "should raise ArgumentError for arguments that are not boolean" do
  lambda{ Foo.validate_arguments(something_non_boolean) }.should raise_error(ArgumentError)
end

答案 2 :(得分:2)

除非为非布尔值抛出异常非常重要,否则我认为将值强制转换为布尔值更为优雅,例如使用!!

baz = !! options.fetch(:baz, true)

这样客户端代码可以传递任何truthy或falsy值,但你仍然可以确定你使用的值是一个合适的布尔值。如果您认为baz = options.fetch(:baz, true) ? true : false不清楚,也可以使用三元运算符(例如!!