我有一个有趣的情况。我正在测试以下简单的创建操作:
# 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
似乎微不足道,但我得到以下内容:
缺少模板点击/创建
任何提示都将不胜感激。
答案 0 :(得分:11)
答案 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::Behavior
的get
/ post
/ put
/ delete
方法即可调用控制器操作,而不需要调用xhr
,因为它会成功调用方法,不渲染任何东西,然后继续,同时保持UJS行为不变。