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

Ave*_*ery 7 variables rspec

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

Muh*_*ais 14

我总是喜欢让一个实例变量出于以下几个原因:

  • 实例变量在被引用时就会存在,这意味着如果你在实例变量拼写中犯了任何错误,那么当新的实例变量初始化为nil时,它肯定会引发一些问题.但是,如果你拼错它,你会得到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
    
    Run Code Online (Sandbox Code Playgroud)

虽然所有的规格都运行良好但是没有@movie在第一个规范中使用而@user在第二个规范中没有使用.

你也可以使用let with bang"!" let!,let懒惰地评估,如果不调用它将永远不会被实例化,用于let定义memoized helper,同时let!在每次方法调用之前强制评估.

  • 也许他想这样说:在所有方面,`let`比实例变量更可取,并且总是比实例变量更有利. (2认同)

Ale*_*eks 7

我赞成这个问题,但最后我自己回答了这个问题.

首先描述差异

let使用方法时,直到在该测试中引用它不初始化变量-这使得它不同于@instance variables其从一开始初始化.

一般来说,没有很大的不确定性.使用@instance variables时,你要确保let对象初始化.但另一方面,这可以做同样的事情let!,因此没有明显的使用理由@instance variable.

总之,对我来说,没有明显的理由来使用@instance variablelet,但没有明显的理由使用@instance variableslet!

@instance variables加载需要更多时间,并且通过使用它们可能会导致代码中不必要的复杂性,这可以通过使用let或避免let!

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

何时使用RSpec let()?

RSpec:let和a block之间有什么区别?