Come faccio a testare il titolo di una pagina da una vista specifica RSpec?
-
25-09-2019 - |
Domanda
Sto imparando RSpec 2 con Rails 3. Al fine di impostare il contenuto del tag nel layout per ogni pagina, ho un aiutante che può essere utilizzato per impostare il titolo e poi tornare:
def page_title(subtitle=nil)
if @title.nil?
@title = ["Site Name"]
end
unless subtitle.nil?
@title << subtitle
end
@title.reverse.join " - "
end
L'helper viene chiamato da entrambi il layout, in cui ritorna il titolo, e le singole viste, dove si imposta il titolo. Ora, voglio prova nelle specifiche vista che il titolo è stato impostato correttamente. Dal momento che il layout non è reso, ho deciso di chiamare page_title dal spec e verificare che il valore di ritorno è quello che mi aspettavo che fosse. Tuttavia, questo non funziona, e sempre e solo restituisce "Nome del sito". Cosa devo fare?
Soluzione
Non sono sicuro se questo è quello che volevi dire, ma si potrebbe provare direttamente il layout:
require 'spec_helper'
include ApplicationHelper
describe "layouts/application" do
it "should add subtitle to page title" do
page_title("Subtitle")
render
rendered.should have_selector('title:contains("Subtitle - Site Name")')
end
end
Modifica
Si potrebbe anche prova che il metodo page_title
viene chiamato nella vista:
describe "mycontroller/index" do
it "should set subtitle" do
view.should_receive(:page_title).with("Subtitle")
render
end
end
o si potrebbe utilizzare un test di controllo con render_views
:
describe Mycontroller do
render_views
it "sets the page title" do
get :index
response.body.should contain("Subtitle - Site Name")
end
end
Altri suggerimenti
Per controllare il titolo di una pagina in una vista specifica prova:
require "spec_helper"
describe "controller/view.html.erb" do
it "renders page title with 'Title | MySite'" do
render template: "controller/view", layout: "layouts/application"
rendered.should have_selector("title", text: "Title | MySite")
end
end
A causa di rendering viene chiamato al di fuori del controllo, ha bisogno di essere raccontato il layout.