似乎有很多支持在rspec中使用let()
来初始化变量。有哪些情况下使用实例变量(即@name
)?
答案 0 :(得分:14)
我总是喜欢让一个实例变量出于以下几个原因:
实例变量在被引用时就会存在 意味着如果你在实例变量拼写中犯了任何错误 它肯定会引导您将某些问题作为新的实例变量 初始化为零。但是如果你让你得到NameError 拼错它。
此外,您将在之前初始化实例变量 块,表示每次执行块之前都会执行 即使该规范不使用那些实例变量,规范也会运行 你已经初始化了。以下给出的例子;
before do
@user = Factory :user
@movie = Factory :movie
end
it "should have user" do
@user.should eq User.first
end
it "should have movie" do
@movie.should eq Movie.first
end
虽然所有规格都运行良好,但第一个规范中没有使用@movie
,第二个规范中没有使用@user
。
你也可以使用let with bang“!” let!
,let
被懒惰地评估,如果你不调用它将永远不会被实例化,使用let
定义memoized helper,而let!
在每个方法之前被强制评估调用
答案 1 :(得分:7)
我赞成这个问题,但最后我自己回答了这个问题。
首先描述差异
let
方法在使用时不会初始化变量,直到它在测试中被引用 - 这使得它与从开头初始化的@instance variables
不同。
总的来说,没有太大的不确定性。如果要确保@instance variables
对象已初始化,请使用let
。但另一方面,这可以与let!
相同,因此没有明显的理由使用@instance variable
。
总而言之,对我来说,@instance variable
比let
更明显,但没有明显的理由使用@instance variables
而不是let!
1}}
@instance variables
需要更多时间加载,并且通过使用它们可能会导致代码中出现不必要的复杂性,使用let
或let!
您也可以看看这两个答案,也许它会为您提供更多信息:
RSpec: What is the difference between let and a before block?