2013-08-23 34 views
0

我正在学习Michael Hartl的Tutorial中的Rails,我对符号如何工作以及如何使用它有点困惑。如何在Ruby中使用符号

这里是注册页面的测试代码片段:

describe "signup" do 

    before { visit signup_path } 

    let(:submit) { "Create my account" } 

    describe "with invalid information" do 
     it "should not create a user" do 
     expect { click_button submit }.not_to change(User, :count) 
     end 
    end 

我的问题是,如果不是这种click_button :submit用冒号(:)?

我知道符号像不可变的字符串,不能被赋值如:submit = "Create my account"。但那么let()方法究竟做了什么?

我有一个Java背景,我有点与符号概念混淆。

回答

3

您遇到问题rspec,而不是符号。用Java术语来说,符号介于final Stringenum之间,我相信你的理解是合适的。这是这里的一个关键问题:

但是那么let()方法到底做了什么?

let是一个rspec方法,该方法定义了要为每个示例设置的变量。所以,基本上,

let(:submit) { "Create my account" } 

(其中:submit是一个符号)每个it块之前指示rspec做这样的事情

submit = "Create my account" 

(其中submit是一个变量)。

(这是一种简化。通过let此处定义submit实际上不变量,但是方法名,它返回在每个例子中let设置在其第一次调用所述块的评价,并在每个高速缓存的值然后你可以把它看作是只读变量,在某种意义上,let :submit { ... }的作用与attr :submit的作用类似:它们都动态地在当前的上下文中插入方法)

了解更多关于lethere

+0

感谢您的解释。这真的有帮助。我明白了Let方法为什么需要这个符号。我不确定为什么有人会对这个答案投下赞成票。我会稍微接受这一点。 –

0

除了几个硬连线结构等module Fooclass Foodef fooalias foodefined?{foo},也没有办法来指代一个未定义的方法/可变/恒定逐字内。

let等情况下,使用符号或字符串代替。 let本身并没有对:submit做任何事情。它定义了一个名为submit的方法,并且方法submit的拼写由符号:submit给出。如果方法let被设计为采用像"submit"这样的字符串,那么这同样适用。

相关问题