我正在阅读 rspec 教程,我只需要帮助确认以下代码的含义:
@eleven_am = Time.parse("2011-1-2 11:00:00")
Time.stub(:now) { @eleven_am }
我想这意味着我要假装现在的时间是 2011 年 1 月 2 日,即使它不是。这是怎么回事?
是的,存根重新定义了一种方法,可以为您的测试做任何决定。通常它们用于避免非确定性方法(例如Time.now
,显然每次都返回不同的值,因此很难测试),或者掩盖与当前测试无关的方法。
有几种方法可以编写存根。您展示的示例使用块形式,它允许您动态决定方法的返回值,因此可以用于相当复杂的事情(基本上您可以完全重新定义方法,尽管这通常不是一个好主意! )。
您可以编写“静态”存根(仅返回一个值,并且与块形式不同,每次都不能重新计算它)。有几种语法:
# 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)
在您展示的示例中,您不需要块形式,因为每次返回的值都是相同的。然后,这只是个人口味的问题,你喜欢哪一个!
是的,存根方法的作用是拦截您发送的任何消息,而不是在对象上调用该方法,它只是返回您告诉它的值,在本例中为@eleven_am 的值。
以防万一其他人漫步并注意到这一点,我会添加一个警告。 Time.stub(:now)
仅存根 Time 类。如果您的代码依赖于可能调用 Date 类的任何内容(包括其他库),则需要确保也将其删除,否则您现在在测试中有两个不同的时钟。