Rails教程第5章练习3 - 原始完整标题功能有什么作用?

时间:2013-04-18 16:55:24

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

我对第5章练习3 here感到困惑,它取代了对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

还有一个同名的rails helper函数:

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

创建一个直接测试函数的应用程序助手: 规格/助手/ 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 helper函数,但我认为utilities.rb中的完整title函数用于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时,似乎做出改变的坏主意我不明白。

谢谢, 标记

2 个答案:

答案 0 :(得分:4)

来自 spec / support / utilities.rb 的规范始终调用中的

full_title

在您使用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

与<{1}}

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

因此,当规范调用module ApplicationHelper函数时,它是从 utilities.rb 调用的,这是可能的,因为函数已经通过使用{{1}混合了}。

答案 1 :(得分:0)

不幸的是,演习说:

  

在代码清单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 helper包含以下include语句:

include ApplicationHelper
  

目前,   你可以假装包含一个模块插入方法   include语句中的模块。应用程序助手恰好在名为ApplicationHelper的模块中定义 - 打开文件app / helpers / application_helper.rb并查看。

     

接下来,编写测试   应用程序帮助程序,以确保它正常工作。