Time.stub(:now){fake_time}究竟做了什么?

时间:2013-01-14 20:21:01

标签: ruby rspec

我正在阅读一篇rspec教程,我只需要帮助确认以下代码的含义:

@eleven_am = Time.parse("2011-1-2 11:00:00")
Time.stub(:now) { @eleven_am }

我认为这意味着我要假装现在的时间是2011年1月2日,尽管事实并非如此。那是怎么回事?

3 个答案:

答案 0 :(得分:4)

是的,存根重新定义了一种方法,可以为您的测试做出任何决定。通常它们用于避免非确定性方法(如Time.now,这显然每次返回一个不同的值,因此很难测试),或者掩盖与当前测试无关的方法。 / p>

有几种方法可以编写存根。您显示的示例使用块形式,它允许您动态决定方法的返回值,因此可以用于非常复杂的事情(基本上您可以完全重新定义方法,虽然这通常不是一个好主意! )。

你可以编写“静态”存根(只返回一个值,而且与块形式不同,每次都不能计算它)。有几种语法:

# Hash form, useful for stubbing multiple things at once
Time.stub(:now => @eleven_am, :then => @ten_am)

# and_return, which reads fluently
Time.stub(:now).and_return(@eleven_am)

在您显示的示例中,您不需要需要块表单,因为每次返回的值都是相同的。然后,这只是个人品味的问题,你喜欢哪一个!

答案 1 :(得分:1)

是的,存根方法所做的是截取你发送的任何消息,而不是在对象上调用该方法,它只返回你告诉它的值,在这种情况下是@eleven_am的值。

答案 2 :(得分:0)

以防万一其他人漫步并注意到这一点,我会添加一个警告。 Time.stub(:now)只会截断Time类。如果你的代码依赖于任何可能调用Date类的东西(包括其他库),你需要确保它们也被删除了,否则你现在在测试中有两个不同的时钟。