rspec的源代码"描述"方法(和其他人)?

时间:2014-06-13 13:42:32

标签: ruby-on-rails rspec rubygems dsl core

我现在正在通过迈克尔·哈特尔的Rails教程漫步,并且发现我经常被鼓励使用精彩的方法,莫名其妙地做出令人惊奇的事情。他总是能够很好地解释他们的工作,但是他们为什么以及如何工作并没有真正的细节。

具体来说,我刚刚在github上搜索rspec gem,搜索"描述"的源代码。方法。我找不到它了。现在已经阅读了大量的源代码(以约25%的逮捕率)搜索它,我知道一旦找到它,我将需要查看其父类和模块,以便在我之前了解一定量的继承能够真正掌握(然后永不放弃)"描述"的肉体和骨骼。

我不介意努力去理解这个概念,我很想在我完全理解它之前尝试用新语言阅读代码,这样我以后可以再次阅读它并使用我理解的比较作为衡量我流利程度的标准。我只是喜欢踢球。一个描述或一个文件位置,可能有一点帮助提示让我开始。

例如......

我发现了这个:

  #     RSpec.describe "something" do # << This describe method is defined in
  #                                   # << RSpec::Core::DSL, included in the
  #                                   # << global namespace (optional)

和rpsec / core / dsl说明:

# DSL defines methods to group examples, most notably `describe`,
# and exposes them as class methods of {RSpec}. They can also be
# exposed globally (on `main` and instances of `Module`) through
# the {Configuration} option `expose_dsl_globally`.

但是没有&#34;类Describe&#34;或def&#34;描述&#34;或者在那个文件中。

那么:谁能告诉我&#34;描述&#34;方法是,它是如何工作的,确切地,或者(如果没有)为什么我在错误的位置天真地寻找错误的东西?

2 个答案:

答案 0 :(得分:2)

您可能知道,describecontext方法之间没有区别,您可以互换使用它们。 Rspec开发人员不能让自己为不同的方法名重复相同的代码,因此他们将声明移到

module RSpec
  module Core
    class ExampleGroup
      def self.define_example_group_method(name, metadata={})
        # here they really define a method with given name using ruby metaprogramming
        define_singleton_method(name) do |*args, &example_group_block|

稍后为所有相同功能的DSL方法调用该方法:

define_example_group_method :example_group
define_example_group_method :describe
define_example_group_method :context

因此,如果您正在寻找describe方法来源,请假设define_example_group_method参数等于name并且describe是您的阻止,潜入example_group_block体。

答案 1 :(得分:0)

RSpec代码库不是一件容易的事情。但是,这些链接应该让你开始......

此行定义describe关键字:

https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/example_group.rb#L246

上面的方法,该行为您提供繁重的工作。花点时间阅读它。

这部分然后公开生成的方法:

https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/dsl.rb#L54

祝你好运!