我倾向于使用before块来设置实例变量。然后在我的示例中使用这些变量。我最近遇到了let()。根据RSpec文档,它用于
。。。定义一个已记忆的辅助对象方法。该值将在同一示例中的多个调用之间缓存,但不会跨示例缓存
这与在before块中使用实例变量有何不同?什么时候应该使用let()vsbefore()
我总是喜欢使用let而不是实例变量,原因如下:
- 实例变量在被引用时突然出现。这意味着,如果您不注意实例变量的拼写,将创建一个新的实例变量并将其初始化为
nil,这可能会导致细微的错误和误报。因为let创建了一个方法,所以当你拼错它时,你会得到一个namererror,我觉得这更可取。这也使得重构规范变得更容易 before(:each)hook将在每个示例之前运行,即使示例没有使用hook中定义的任何实例变量。这通常不是什么大问题,但是如果实例变量的设置需要很长时间,那么您就是在浪费周期。对于由let定义的方法,初始化代码仅在示例调用它时运行- 您可以将示例中的局部变量直接重构为let,而无需更改
引用示例中的语法。如果重构为实例变量,则必须进行更改
如何引用示例中的对象(例如,添加@) - 这有点主观,但正如Mike Lewis指出的,我认为它使规范更易于阅读。我喜欢用
let定义所有依赖对象并保持it块简洁的组织方式
可在此处找到相关链接:http://www.betterspecs.org/#let