我对第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时,似乎做出改变的坏主意我不明白。
谢谢, 标记
答案 0 :(得分:4)
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并查看。
接下来,编写测试 应用程序帮助程序,以确保它正常工作。