Como faço para testar o título de uma página de uma especificação de visualização RSPEC?
-
25-09-2019 - |
Pergunta
Estou aprendendo RSPEC 2 com Rails 3. Para definir o conteúdo da tag no layout para cada página, tenho um ajudante que pode ser usado para definir o título e depois devolvê -lo:
def page_title(subtitle=nil)
if @title.nil?
@title = ["Site Name"]
end
unless subtitle.nil?
@title << subtitle
end
@title.reverse.join " - "
end
O ajudante é chamado do layout, onde retorna o título e as visualizações individuais, onde define o título. Agora, quero testar as especificações de visualização de que o título está sendo definido corretamente. Como o layout não é renderizado, decidi ligar para Page_title da especificação e verificar se o valor de retorno é o que eu espero que seja. No entanto, isso não funciona e sempre retorna "nome do site". O que devo fazer?
Solução
Não tenho certeza se é isso que você quis dizer, mas você pode testar o layout diretamente:
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
EDITAR
Você também pode testar que o page_title
O método é chamado na vista:
describe "mycontroller/index" do
it "should set subtitle" do
view.should_receive(:page_title).with("Subtitle")
render
end
end
ou você pode usar um teste de controlador com render_views
:
describe Mycontroller do
render_views
it "sets the page title" do
get :index
response.body.should contain("Subtitle - Site Name")
end
end
Outras dicas
Para verificar o título de uma página em uma especificação de visualização, tente:
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
Como a renderização está sendo chamada fora do controlador, ele precisa ser informado sobre o layout.