1

我正在从 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

我的问题是,这不应该click_button :submit是冒号(:) 吗?

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

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

4

2 回答 2

5

你有问题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 { ... }does 类似于 what attr :submitdoes:它们都在当前上下文中动态插入方法。)

阅读更多关于let 这里

于 2013-08-23T02:39:05.603 回答
0

module Foo除了在诸如, class Foo, def foo, alias foo,之类的一些硬连线结构中,defined?{foo}没有办法逐字引用未定义的方法/变量/常量。

在诸如 的情况下let,使用符号或字符串代替。let没有对:submit自己做任何事情。它定义了一个名为的方法submit,该方法的拼写submit由符号给出:submit。如果该方法let被设计为采用类似 的字符串"submit",那么它同样可以正常工作。

于 2013-08-23T02:39:25.440 回答