在RSpec视图测试中使用render

时间:2014-07-16 19:03:46

标签: ruby-on-rails rspec

我使用RSpec来测试我的观点。我想测试edit操作的视图是否包含字段(或文本)" Director"。它在render上窒息。这是我的代码:

# spec/views/movies/edit.html.haml_spec.rb
require 'spec_helper'

describe 'movies/edit.html.haml' do
  it 'displays \'director\' field on edit page' do
    render
    expect(rendered).to have_content("Director")
  end
end

运行此操作时出现以下错误:

Failure/Error: render
ActionView::Template::Error:
  No route matches {:action=>"show", :controller=>"movies", :id=>nil}

我的理解是约定优于配置意味着没有任何参数的render应该呈现预期的视图app/views/movies/edit.html.haml我不知道它为什么要寻找行动路线show。该路线确实存在,但它与此规范无关。

我已经尝试了render的许多论据,没有运气:

render :edit
render action: :edit # is this even valid?
render :action => :edit
render "edit"
render "edit.html.haml"
render action: "edit"
render action: "edit.html.haml"
render :action => "edit"
render :action => "edit.html.haml"

以上所有产生两个错误之一:

ArgumentError:
  You invoked render but did not give any of :partial, :template, :inline, :file or :text option.

OR

ActionView::MissingTemplate:
  Missing partial /edit, movies/edit with {:locale=>[:en], :formats=>[:html, :text, :js, :css, :ics, :csv, :png, :jpeg, :gif, :bmp, :tiff, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip], :handlers=>[:erb, :builder, :coffee, :haml]}.

我没有尝试渲染局部,我试图渲染完整视图。我是否错误地使用了约定,或者错误地使用render

编辑1 :我不会认为它是偏袒的。 app/views/movies/edit.html.haml有一个视图。我可能无法正确理解偏见是什么。

Edit2 :我为new操作尝试了相同的规范,它似乎运行良好(文本不存在时失败,文本存在时传递)。这是否意味着我需要将edit视图加载为部分视图,还是需要为@movie提供虚拟数据?为什么edit是部分的?

1 个答案:

答案 0 :(得分:0)

对于寻找类似内容的其他人,您应该为要渲染的视图指定电影模型。

以下内容应该有效:

describe 'movies/edit.html.haml' do
  let(:movie) { Movie.create(movie_params_go_here) }

  it 'displays \'director\' field on edit page' do
    assign(:movie, movie)
    render
    expect(rendered).to have_content("Director")
  end
end