Как проверить, что недопустимые аргументы вызывают исключение ArgumentError с использованием RSpec? - PullRequest
13 голосов
/ 16 мая 2010

Я пишу RubyGem, который может вызвать ArgumentError, если аргументы, предоставленные его единственному методу, недопустимы. Как я могу написать тест для этого, используя 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 ]

28 голосов
/ 16 мая 2010

Я использую что-то похожее на то, что опубликовал 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).

3 голосов
/ 16 мая 2010
it "should raise ArgumentError for arguments that are not boolean" do
  lambda{ Foo.validate_arguments(something_non_boolean) }.should raise_error(ArgumentError)
end
2 голосов
/ 16 мая 2010

Если не очень важно, чтобы вы выдавали исключение для небулевых значений, я думаю, было бы более элегантно привести значение к логическому значению, например, с помощью !!:

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

Таким образом, клиентский код может передавать любое истинное или ложное значение, но вы все равно можете быть уверены, что значение, с которым вы работаете, является правильным логическим значением. Вы также можете использовать троичный оператор (например, baz = options.fetch(:baz, true) ? true : false, если считаете, что !! неясно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...