RSpec控制器测试:创建时缺少模板

时间:2012-08-17 03:44:49

标签: ruby-on-rails ruby rspec

我有一个有趣的情况。我正在测试以下简单的创建操作:

# will only be accessed via Ajax 
def create
 click = Click.new(params[:click])
 click.save # don't really care whether its success or failure
end

然后我有以下非常简单的控制器规范:

require 'spec_helper'

describe ClicksController, "creating a click" do
  it "should create a click for event" do
    xhr :post, :create, :click => {:event_id => 1}
    # more test to come...
  end
end

似乎微不足道,但我得到以下内容:

缺少模板点击/创建

任何提示都将不胜感激。

4 个答案:

答案 0 :(得分:11)

添加到控制器操作:

render :nothing => true

这个会自动创建适当的服务器响应。更多here

答案 1 :(得分:5)

如果您的控制器仅渲染JSON或XML,您将收到此错误,但您没有在规范中指定格式;您的请求默认为不支持的HTML。在这种情况下,只需在从规范中调用控制器方法时指定支持的格式。例如,更改此:

post :create, registration: @user_hash

到此:

post :create, registration: @user_hash, format: :json

答案 2 :(得分:2)

如果您没有在控制器操作中渲染任何内容,rails将尝试默认渲染模板(在本例中为clicks/create)。我建议至少渲染一条成功的消息:

render :json => {:success => true}

答案 3 :(得分:1)

megas's answer上构建,如果你想测试一个只能通过UJS链接访问并且只有.js.erb模板的控制器动作,我会把它放在控制器中以避免破坏你的UJS功能:

respond_to do |f|
  f.html { render nothing: true } # prevents rendering a nonexistent template file
  f.js # still renders the JavaScript template
end

这样,您只需调用ActionController::TestCase::Behaviorget / post / put / delete方法即可调用控制器操作,而不需要调用xhr,因为它会成功调用方法,不渲染任何东西,然后继续,同时保持UJS行为不变。