2013-01-02 29 views

回答

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 
    

虽然所有的功能运行正常,但在第一规格和第二没有用的@user不使用的@movie

你也可以使用let with bang“!” let!,let是懒惰的评估,如果你不叫它,将永远不会实例化,使用let来定义memoized助手,而let!是在每个方法调用之前强制评估。

+2

也许他想说的话是这样的:在所有点,'let'最好实例变量和总是比实例变量更有利。 –

7

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

首先来描述差异

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

总的来说,没有太大的缺陷。如果要确保let对象已初始化,请使用@instance variables。但另一方面,这可以与let!完成相同,所以没有明显的理由使用@instance variable

总之,对我来说,有明显理由使用@instance variable超过let,但没有明显的理由使用@instance variables超过let!

@instance variables需要更多的时间来加载,并通过他们,能导致这可以通过使用letlet!

你可以看看这两个答案,以及避免在代码中不必要的复杂性,也许它会给你一些更多的信息:

When to use RSpec let()?

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

相关问题