如果提供给它的单个方法的参数无效,我正在编写一个可以引发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
答案 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
不清楚,也可以使用三元运算符(例如!!
。