何时使用实例变量比使用let()更有利?

时间:2013-01-02 03:39:11

标签: variables rspec

似乎有很多支持在rspec中使用let()来初始化变量。有哪些情况下使用实例变量(即@name)?

2 个答案:

答案 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 variablelet更明显,但没有明显的理由使用@instance variables而不是let! 1}}

@instance variables需要更多时间加载,并且通过使用它们可能会导致代码中出现不必要的复杂性,使用letlet!

可以避免这种情况

您也可以看看这两个答案,也许它会为您提供更多信息:

When to use RSpec let()?

RSpec: What is the difference between let and a before block?