【问题标题】:Using rspec-expectations gem to validate arguments in an API使用 rspec-expectations gem 验证 API 中的参数
【发布时间】:2011-08-08 02:13:51
【问题描述】:

所以,假设我正在编写一个 API 来制作美味的糖霜蛋糕。这一切都很好并且记录在案,但偶尔会出现错误,或者用户正在通过 IRB 探索库,并且在他们进行原型设计时使用了一个变量。

这就是我通常向调用者指示参数不能为 nil / 具有其他约束的方式:

# Cake.rb
def make_cake(cake_type, *arguments)
  raise "cake_type required!" unless !cake_type.nil?
  raise "cake_type must be in KNOWN_CAKES" unless KNOWN_CAKES.include?(cake_type)
  # blah blah blah
end

但是,我最近考虑过这样的事情,使用 rspec-expectations gem:

# Cake.rb
include RSpec::Matchers
def make_cake(cake_type, *arguments)
  cake_type.should_not be_nil, "cake_type required"
  KNOWN_CAKES.should include(cake_type), "cake_type not found"
end

优点:

  • 简洁的 DSL 让针对 API 进行开发的人们非常容易阅读。
  • RSpec::Expectations::ExpectationNotMetError 有一些很好的异常格式,为您提供预期值与实际接收值。

骗局:

  • RSpec::Expectations::ExpectationNotMetError 可能有点冗长。

那么,这种方法:好主意还是坏主意?它违反了哪些设计原则?

【问题讨论】:

    标签: ruby rspec2 rspec-expectations


    【解决方案1】:

    作为调用者,如果从 API 调用中返回 RSpec 异常,我会感到惊讶。

    你真的收获很多吗?如果您只是更改为raise 'cake type required!' if cake_type.nil? 会怎样。对我来说,似乎比您的原始代码更清晰。也许您这样写是为了两次都使用unless

    难道您不能仅仅通过提出更好的消息来实现回传预期/接收值的目标 - 也许通过您自己的异常类?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多