2013-04-18 34 views
4

我對第5章練習3 here替換爲full_title測試助手需要混淆Rails教程第5章練習3 - 原始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 

還有同名一個軌輔助函數:

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中的完整標題函數用於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') 
    ... 

已在上面的函數調用總是指向實際軌功能,而不是respec功能?如果我能夠消除它首先是什麼?我覺得我在這裏錯過了一些東西。謝謝你的幫助。看起來像一個不好的主意來進行更改我不明白我的目標是何時學習Rails。

謝謝, 馬克

回答

4

在規格full_title總是從規格/支持/ utilities.rb電話。

之前更換了代碼include ApplicationHelperfull_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 

from helpers/application_helper.rb

這有什麼規範describe ApplicationHelper /助理/ application_helper_spec.rb

真正發生的是,從module ApplicationHelperfull_title功能現在是mixed in (see Mixins)utilities.rb。因此,utilities.rb可以從module ApplicationHelper(helpers/application_helper)獲得對函數full_title的訪問。rb)

所以,當規格要求的full_title功能,它是從utilities.rb,因爲通過使用include ApplicationHelper的功能已經混在其中,可以調用。

+2

謝謝!很好的解釋。我很高興瞭解這個(以及更大的mixin概念)如何工作。昨天如此令人費解的事情現在清晰可見。 – Mark

0

不幸的是,鍛鍊說:

通過 編寫測試原始輔助方法,消除了上市5.29在full_title測試助手的需要,如清單 5.41英寸(您必須創建spec/helpers目錄和application_helper_spec.rb文件。)然後使用代碼清單5.42中的代碼 將其包含在測試中。

......這是完全錯誤的。

一些準備工作:

在app /傭工/ application_helper.rb的full_title()方法,可用於整個應用程序規則代碼的方法 - 而不是RSpec的測試。 spec/support/utilities.rb中的full_title()方法已添加,以便rspec測試可以調用它。

術語:

應用助手 =在應用程序中的方法full_title /助手/ application_helper.rb

rspec的輔助 =在規範中full_title方法/支撐/ utilities.rb

爲應用程序幫助程序編寫測試並不會消除對rspec幫助程序的需求 - 因爲爲一種方法編寫測試並不會奇蹟般地消除對其他方法的需求。什麼文本應該說是這樣的:

可以消除需要對RSpec的幫手,這是應用助手的 重複,用以下替換 RSpec的幫手包括聲明:

include ApplicationHelper 

暫時, 你可以假裝包括一個模塊插入 模塊中的方法在包括語句的點。應用程序助手恰好在名爲ApplicationHelper的模塊內部定義 - 打開文件app/helpers/application_helper.rb並查看。

接下來,編寫測試 應用程序幫助程序以確保其正常工作。

相關問題