6

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

# 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

4 回答 4

11

添加到控制器动作:

render :nothing => true

这将自动创建适当的服务器响应。更多在这里

于 2012-08-17T03:58:33.400 回答
5

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

post :create, registration: @user_hash

对此:

post :create, registration: @user_hash, format: :json
于 2014-07-01T20:32:56.933 回答
2

如果您没有在控制器操作中渲染任何内容,rails 将尝试默认渲染模板(在这种情况下clicks/create)。我建议至少返回一条成功消息,如下所示:

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

于 2012-08-17T03:51:28.887 回答
1

基于megas 的回答,如果您要测试只能通过 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's get///方法而不需要调用来调用控制器操作post,因为它将成功调用该方法,不渲染任何内容并继续,同时保持您的 UJS 行为不变putdeletexhr

于 2014-02-26T21:30:57.863 回答