如何在 Ruby 中使用符号

Ayr*_*nna 1 ruby rspec ruby-on-rails

我正在从 Michael Hartl 的教程中学习 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
Run Code Online (Sandbox Code Playgroud)

我的问题是,这不应该click_button :submit与冒号(:) 一起使用吗?

我知道符号就像不可变的字符串,不能像:submit = "Create my account". 但是,该let()方法究竟做了什么?

我有 Java 背景,我对符号概念有点困惑。

Ama*_*dan 5

你有问题rspec,而不是符号。在 Java 术语中,符号介于final String和之间enum,我相信您的理解是合适的。这是这里的一个关键问题:

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

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

let(:submit) { "Create my account" }
Run Code Online (Sandbox Code Playgroud)

(where :submitis a symbol) 指示rspec做类似的事情

submit = "Create my account"
Run Code Online (Sandbox Code Playgroud)

(其中submit是一个变量)在每个it块之前。

(这是一个简化。submit这里定义的let实际上不是一个变量,而是一个方法名称,它返回let每个示例中第一次调用中提供的块的评估,以及同一示例中每次后续调用的缓存值。但是你可以把它当作一个只读变量来对待。在某种程度上,let :submit { ... }它的作用类似于attr :submit:它们都在当前上下文中动态插入方法。)

阅读更多关于let 这里