就像 Dave 已经提到的,提供的代码不是 rake 任务,而是 RSpec 规范。
但让我在这里关注真正的问题。
如果您从未接触过具有类似功能的任何其他语言,则符号一开始有点难以掌握。一些语言称它为 Atom。
http://en.wikipedia.org/wiki/Symbol_(编程)
符号的想法是提供一种人类可读但计算成本低的原始类型。
在 Ruby 中,当编译器/解释器看到一个符号时,它会创建一个 Symbol 类型的对象并将其存储在内存中。在 ruby 中,符号是单例,因此任何其他使用相同符号的方法都会返回完全相同的对象,这使得它在空间方面非常便宜,而且比较起来也非常便宜,因为您可以只比较内存地址而不是内容。
例如,如果您比较两个符号,如下所示:
:foo == :foo
您几乎是在比较同一个对象,这意味着只需要比较内存地址。
现在,当您比较两个字符串时:
"foo" == "foo"
它创建两个具有相同内容的 String 实例,并且需要比较字符串的每个字节以确保它们相等。
这个属性使得 Symbols 非常适合散列中的标识符或键。
现在,到 RSpec。
让我们看下面的例子:
describe Authenticator do
let(:user) { Factory.create(:user) )
it "authenticate" do
auth_user = subject.authenticate(user.login, user.password)
auth_user.should == user
end
end
Factory.create 将符号作为要使用的工厂的标识符。您需要自己定义工厂,所以实际上它只是一个名称。您可以使用字符串,但使用符号更便宜也是最佳实践,但老实说,除非您调用 Factory.create 数百万次,否则不会有太大区别。
let 不是定义一个变量,它实际上是定义一个做一些事情的方法:
- 第一次在规范(it 块)内调用该方法时,它将执行该块,缓存结果并返回它
- 同一规范内的任何其他调用(它块)只会返回缓存的结果
- 规范完成后,它会删除缓存的结果,以便在下一次调用时重新评估,在下一个规范
这允许仅在需要时延迟创建对象,并允许将任何状态更改限制为当前规范。
因此,底线是:RSpec 使用该符号作为方法名称的标识符,该方法名称将被生成以抽象出某些事物,让您的生活更轻松。RSpec 只不过是一种使用元编程来构建测试套件的 BDD 领域特定语言。
使用以下测试用例可以实现相同的行为:
class AuthenticatorTest < Test::Unit::TestCase
def user
return @user if @user
@user = Factory.create(:user)
end
def subject
return @subject if @subject
@subject = Authenticator.new
end
def teardown
@subject = nil
@user = nil
end
def test_authenticate
auth_user = subject.authenticate(user.login, user.password)
assert_equal auth_user, user
end
end
请注意,您可能不应该编写这样的测试用例,但它(大致)说明了 RSpec 的作用。
我希望这有帮助。