0

我目前正在遵循一个教程,但Rails和Rspec已经发展,尤其是编写测试。在视图规范中测试“动态”页面标题(Rails 4 + RSpec 3)

我的目标是测试,当我访问该网页“http://domain.fr/用户/ 1”页面标题遵循以下格式:"#{base_title} | #{@user.name}"其中base_title是恒定的。

之前,我看到它是可以使用的控制器规格render_views,但它是不是最好的方法,它不会在Rails中存在了4/3的RSpec

我的最后一次尝试是:

require 'rails_helper' 

describe "users/show.html.erb", type: :view do 
    it "Should finally render a correct title" do 
    user = FactoryGirl.create(:user) 
    assign(:user, user) 
    render template: "users/show.html.erb", layout: "layouts/application.html.erb" 
    expect(rendered).to have_selector("title", text: user.name) 
    end 
end 

我使用一个帮手在application.html.erb渲染:<title><%= title %></title>

这里是助手:

def title 
    base_title = "Simple App du Tutoriel Ruby on Rails" 
    @title.nil? ? base_title : "#{base_title} | #{@title}" 
end 

而且显示方法从users_controller.rb

def show 
    @user = User.find(params[:id]) 
    @title = @user.name 
end 

我还添加了resources :users的routes.rb文件。

上述测试失败,因为只显示标题的不变部分。因此,我认为用户#显示未被调用,@title未定义,但我不明白如何实现此目的。

另外我的目标是避免在我的视图中为每个变量调用assign(),因为当您有很多变量需要渲染时,它可能会出现问题。

感谢您的帮助:)

回答

1

你忘了title分配:

assign(:user, user) 
assign(:title, user.name) 
+0

但如果我必须使很多变量在我看来,是不是有一种自动自动解析我的视图的变量? 如果我有一个很大的看法,我需要为每个变量调用assign()? –

+1

是的。理想情况下,您不需要在控制器操作中使用太多的实例变量。也许把它们包装成一个对象 –

+0

好吧,我理解这个逻辑。非常感谢你 ! –