【问题标题】:Rails Tutorial Chap 5 Exercise 3 - What did the original full_title function do?Rails 教程第 5 章练习 3 - 原来的 full_title 函数做了什么?
【发布时间】:2013-04-18 16:55:23
【问题描述】:

我对第 5 章练习 3 here 感到困惑,它取代了对 full_title 测试助手的需求

spec/support/utilities.rb:

def full_title(page_title)
  base_title = "Ruby on Rails Tutorial Sample App"
  if page_title.empty?
    base_title
  else
    "#{base_title} | #{page_title}"
  end
end

还有一个同名的rails辅助函数:

module ApplicationHelper
  # Returns the full title on a per-page basis.
  def full_title(page_title)
    base_title = "Ruby on Rails Tutorial Sample App"
    if page_title.empty?
      base_title
    else
      "#{base_title} | #{page_title}"
    end
  end
end

通过创建一个应用程序助手来直接测试函数: spec/helpers/application_helper_spec.rb

require 'spec_helper'

describe ApplicationHelper do

 describe "full_title" do
   it "should include the page title" do
     full_title("foo").should =~ /foo/
   end

   it "should include the base title" do
     full_title("foo").should =~ /^Ruby on Rails Tutorial Sample App/
   end

   it "should not include a bar for the home page" do
     full_title("").should_not =~ /\|/
   end
  end
end

这很好,它直接测试 rails 辅助函数,但我认为 utility.rb 中的完整标题函数是用于 Rspec 代码的。所以,我们怎么能把utilities.rb中的上述代码去掉,直接替换成:

include ApplicationHelper

我进行了交换,一切仍然有效。我期待 Rspec 代码,我虽然使用如下 rspec 函数出错,但它没有:

it "should have the right links on the layout" do
  visit root_path
  click_link "About"
  page.should have_selector 'title', text: full_title('About Us')
  ...

上面的函数调用是否总是指向实际的 rails 函数而不是 respec 函数?如果我能够消除它,它首先是为了什么?我觉得我在这里错过了一些东西。谢谢你的帮助。当我的目标是学习 Rails 时,我不明白进行更改似乎是个坏主意。

谢谢, 标记

【问题讨论】:

    标签: ruby-on-rails-3 rspec-rails railstutorial.org


    【解决方案1】:

    full_title 来自 spec/support/utilities.rb 的规范 always 调用。

    在您将代码替换为include ApplicationHelper 之前,规范中的full_title 正在调用utilities.rb 中的函数:

    def full_title(page_title)
      base_title = "Ruby on Rails Tutorial Sample App"
      if page_title.empty?
        base_title
      else
        "#{base_title} | #{page_title}"
      end
    end
    

    只需将代码替换为

    include ApplicationHelper
    

    要清楚,你实际上是包括

    module ApplicationHelper
    

    来自helpers/application_helper.rb

    这与 spec/helpers/application_helper_spec.rb 中的 describe ApplicationHelper没有任何关系

    真正发生的是 full_title 函数从 module ApplicationHelper 现在是 mixed in (see Mixins)utilities.rb。因此,utilities.rb 可以从 module ApplicationHelper(helpers/application_helper.rb) 访问函数 full_title

    因此,当规范调用full_title 函数时,它是从utilities.rb 调用的,这是可能的,因为该函数已通过使用include ApplicationHelper 混入。 p>

    【讨论】:

    • 谢谢!很好的解释。我很高兴了解这个(以及更大的 mixin 概念)现在是如何工作的。昨天令人莫名其妙的事情现在一清二楚。
    【解决方案2】:

    不幸的是,练习说:

    消除对清单 5.29 中 full_title 测试助手的需求 为原始辅助方法编写测试,如清单所示 5.41。 (您必须同时创建 spec/helpers 目录和 application_helper_spec.rb 文件。)然后使用 清单 5.42 中的代码。

    ...这是完全错误的。

    一些准备工作:

    app/helpers/application_helper.rb 中的 full_title() 方法可用于整个应用程序中的常规代码,而不是 rspec 测试。添加了 spec/support/utilities.rb 中的 full_title() 方法,以便 rspec 测试可以调用它。

    术语:

    应用程序助手 = app/helpers/application_helper.rb 中的 full_title 方法

    rspec helper = spec/support/utilities.rb 中的 full_title 方法

    为应用程序助手编写测试并不能消除对 rspec 助手的需要——因为为一种方法编写测试并不能神奇地消除对其他方法的需要。文本应该说的是这样的:

    您可以消除对 rspec 帮助程序的需要,这是一个 应用程序助手的副本,通过替换 rspec 助手,带有以下 include 语句:

    include ApplicationHelper
    

    暂时, 您可以假装包含一个模块会在 在 include 语句处的模块。应用程序助手恰好定义在一个名为 ApplicationHelper 的模块中——打开文件 app/helpers/application_helper.rb 并查看。

    接下来,为 应用程序助手以确保其正常工作。

    【讨论】:

      猜你喜欢
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多