2012-08-17 102 views
4

我有一个有趣的情况。我测试了以下简单的创建操作: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 

似乎微不足道,但我得到如下:

缺少模板点击/创建

任何提示将不胜感激。

回答

10

添加到控制器中的操作:

render :nothing => true 

这人会自动创建相应的服务器的输入反应。更多here

2

如果您在控制器操作中未呈现任何内容,则rails将尝试默认呈现模板(在此例中为clicks/create)。我建议你回去的渲染至少一个成功的消息,像这样:

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

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::Behavior的,而不是get/post/put/delete方法需要调用xhr调用控制器动作,因为它会成功调用该方法,渲染什么,并继续,同时留下你的UJS行为完整。

4

如果您的控制器仅呈现JSON或XML,但您未在规范中指定格式,则会出现此错误;您的请求默认为不受支持的HTML。在这种情况下,只需从规范中调用控制器方法时指定支持的格式即可。例如,更改此:

post :create, registration: @user_hash 

这样:

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