有没有可能告诉rspec警告我,如果存根返回一个不同类型的对象而不是它要替换的方法?

时间:2012-01-19 22:59:45

标签: ruby rspec

我有一个名为save_title的方法:

def save_title (data)
  ...  
  [ if the record exists, update, return 0] 
  [ if the record is new, create, return 1] 
end  

一切都很好,直到我把它打成:

saved_rows = []
 proc.stub(:save_title) do |arg|
  saved_rows << arg
 end

这里的错误是我使用真实方法返回的整数来确定创建的记录数与更新数。存根不返回整数。 Oooops。因此代码在现实中运行良好,但在测试中显得破碎。过了一会儿(比我更愿意承认,包括诅咒)我意识到存根和真实方法的行为不一样。这就是我想的动态语言的缺陷。

问题:

  1. 我可以告诉rspec警告我,如果存根没有返回与真实方法相同的东西吗?
  2. 我是否可以使用分析器宝石来警告这类事情?
  3. 对于从方法中返回值,我不知道某种最佳实践吗?

1 个答案:

答案 0 :(得分:0)

1)rspec无法知道该方法应该返回什么类型的对象,这是你告诉它的,但是......

2)你可以研究一些事情。而不是使用存根,尝试使用模拟而不是测试双。它与存根基本相同,但是,您可以对它进行更多验证(check out the documentation here)。比如调用特定方法的次数,调用它的参数以及返回值应该是什么。如果没有通过任何验证,您的测试将失败。

3)最佳做法是方法名称本身。例如,方法以?结尾?喜欢object.exists?应该总是返回一个布尔值。在你的情况下,我建议你重构一下你的方法,可能会把它分成两部分,一部分用于更新,一部分用于创建,另外一种方法可以告诉你对象是否存在。根据输入,方法以两种不同的方式运行是不好的做法(参见separation of concerns

祝你好运!希望这有帮助。