如何从RSpec视图规范测试页面标题?

时间:2010-10-22 21:50:17

标签: ruby-on-rails ruby-on-rails-3 rspec title rspec2

我正在使用Rails 3学习RSpec 2.为了在每个页面的布局中设置标签的内容,我有一个帮助器,可以用来设置标题,然后返回它:

def page_title(subtitle=nil)
  if @title.nil?
    @title = ["Site Name"]
  end

  unless subtitle.nil?
    @title << subtitle
  end

  @title.reverse.join " - "
end

从布局中返回帮助器,返回标题,以及设置标题的各个视图。现在,我想在视图规范中测试标题是否正确设置。由于没有渲染布局,我决定从规范中调用page_title并检查返回值是否符合我的预期。但是,这不起作用,并且始终只返回“站点名称”。我该怎么办?

2 个答案:

答案 0 :(得分:2)

要在视图规范中检查页面标题,请尝试:

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

因为渲染是在控制器外部调用的,所以需要告诉它布局。

答案 1 :(得分:1)

我不确定这是不是你的意思,但你可以直接测试布局:

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

修改

您还可以测试在视图中调用page_title方法:

describe "mycontroller/index" do
  it "should set subtitle" do
    view.should_receive(:page_title).with("Subtitle")
    render
  end
end

或者您可以使用render_views的控制器测试:

describe Mycontroller do
  render_views
  it "sets the page title" do
    get :index
    response.body.should contain("Subtitle - Site Name")
  end
end