Ruby 使用rspec验证API中的参数

Ruby 使用rspec验证API中的参数,ruby,rspec2,rspec-expectations,Ruby,Rspec2,Rspec Expectations,所以,假设我正在编写一个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

所以,假设我正在编写一个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期望gem考虑了类似的事情:

优点:

简练的DSL使它对于开发API的人来说非常容易阅读。 RSpec::Expectations::ExpectationNotMetError有一些很好的异常格式,可以为您提供预期值和实际接收值。 犯人

RSpec::Expections::ExpectationNotMetError可能有点过于冗长。
那么,这种方法:好主意,还是坏主意?它违反了什么设计原则?

作为调用者,我会惊讶地发现API调用返回了RSpec异常

你真的收获很多吗?如果你只是改为“需要蛋糕类型”怎么办如果蛋糕类型为0,则为0?。似乎比你原来的代码读得更清楚。也许你这样写是为了两次都不使用

难道您不能仅仅通过引发更好的消息(可能是通过您自己的异常类)来实现传回期望值/接收值的目标吗

# 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