我正在学习迈克尔·哈特尔的Tutorial中的Rails,我对符号如何工作/如何使用感到困惑。
以下是注册页面测试中的代码段:
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背景,我对符号概念感到困惑。
答案 0 :(得分:3)
您遇到rspec
问题,而不是符号问题。在Java术语中,符号是final String
和enum
之间的符号,我相信您的理解是恰当的。这是一个关键问题:
但那么let()方法究竟做了什么?
let
是一个rspec
方法,它定义了为每个示例设置的变量。所以,基本上,
let(:submit) { "Create my account" }
(其中:submit
是符号)指示rspec
执行类似
submit = "Create my account"
(其中submit
是变量)在每个it
块之前。
(这是一种简化。submit
这里定义的let
实际上不是变量,而是方法名称,它首先返回let
中提供的块的评估每个示例中的调用,以及同一示例中每个后续调用的缓存值。但是您可以将其视为只读变量。在某种程度上,let :submit { ... }
的作用类似于{{ 1}}:它们都在当前上下文中动态插入方法。)
详细了解attr :submit
here。
答案 1 :(得分:0)
除了module Foo
,class Foo
,def foo
,alias foo
,defined?{foo}
等几个硬连线结构之外,没有办法引用未定义的方法/变量/常数逐字。
在let
之类的场合,使用符号或字符串代替。 let
本身并没有对:submit
做任何事情。它定义了一个名为submit
的方法,方法submit
的拼写由符号:submit
给出。如果方法let
被设计为采用类似"submit"
的字符串,那么这将同样有效。