Rspec存根为什么要使用

时间:2013-08-28 14:59:18

标签: ruby rspec

为什么你会使用stub,因为你应该测试真正的类?

我知道有些情况下你不想测试其他类而不是通过其他相关的类方法,但我仍然认为使用真正的方法更好。

当你想快速跳过一个方法的其他相关任务并返回最终结果以便在测试中使用时,我真的看到了一个好处

我们应该考虑其他好处吗?

(除了上述内容之外,我还认为stub存在风险,因为您的代码可能随着其演变而发生变化,并且可能会生成与测试中生成的内容不同的输出。

1 个答案:

答案 0 :(得分:1)

这取决于您正在执行的测试。对于单元测试,只测试单个类,存根是有益的。

作为示例,假设您正在测试一个类,当其他对象完成did_it!操作时,该类会发送电子邮件:

describe Emailer do
  context ".send_email" do
    it "sends an email if another object 'did_it!'" do
      obj = Obj.new
      Emailer.send_email(obj).should == true # the email sends successfully
    end
  end
end

在这种情况下,如果obj.did_it!是一项超级昂贵的操作,或者它可能会间歇性地失败,那么此测试可能会出现问题。

但是,在此测试中,我们只关心Emailer.send_emailobj.did_it!返回true时正确运行 - 我们并不关心obj.did_it!方法是否有效,因为那是不是我们正在测试的。

所以,我们使用存根来说,“假设obj.did_it!成功,Emailer.send_email实际发送电子邮件?”:

describe Emailer do
  context ".send_email" do
    it "sends an email if another object 'did_it!'" do
      obj = stub(:did_it! => true)
      Emailer.send_email(obj).should == true # the email sends successfully
    end
  end
end