35

如果您的控制器操作如下所示:

respond_to do |format|
  format.html { raise 'Unsupported' }
  format.js # index.js.erb
end

您的功能测试如下所示:

test "javascript response..." do
  get :index
end

它将执行 respond_to 块的 HTML 分支。

如果你试试这个:

test "javascript response..." do
  get 'index.js'
end

它执行视图(index.js.erb)而不运行控制器操作!

4

9 回答 9

63

使用您的正常参数传入a:format以触发该格式的响应。

get :index, :format => 'js'

无需弄乱您的请求标头。

于 2010-03-01T19:32:33.200 回答
25

使用 rspec:

it "should render js" do
  xhr :get, 'index'
  response.content_type.should == Mime::JS
end

并在您的控制器操作中:

respond_to do |format|
  format.js
end
于 2010-06-12T06:23:27.030 回答
5

将接受的内容类型设置为您想要的类型:

@request.accept = "text/javascript"

将此与您的get :index测试结合起来,它将对控制器进行适当的调用。

于 2010-03-01T19:20:36.177 回答
5

RSpec 3.7 和 Rails 5.x 解决方案:

其中一些答案在我的案例中有点过时,所以我决定为那些运行 Rails 5 和 RSpec 3.7 的人提供一个答案:

it "should render js" do
  get :index, xhr: true

  expect(response.content_type).to eq('text/javascript')
end

与史蒂夫的答案非常相似,只是做了一些调整。第一个xhr是作为布尔键/对传递的。其次是我现在使用expect,因为should如果使用会收到弃用警告。比较content_type响应等于text/javascript为我工作。

于 2018-07-20T15:09:41.817 回答
3

在请求之前使用它:

@request.env['HTTP_ACCEPT'] = 'text/javascript'
于 2010-03-01T18:52:55.467 回答
1

这三个似乎是等价的:

  1. get :index, :format => 'js'
  2. @request.env['HTTP_ACCEPT'] = 'text/javascript'
  3. @request.accept = "text/javascript"

它们使控制器使用 js 模板(例如 index.js.erb)

而模拟 XHR 请求(例如,获取 HTML 片段)您可以使用: @request.env['HTTP_X_REQUESTED_WITH'] = "XMLHttpRequest"

这意味着request.xhr?将返回真。

请注意,在模拟 XHR 时,我必须指定预期的格式,否则会出现错误:

get :index, format: "html"

在 Rails 3.0.3 上测试。

我从 Rails 源获得了后者,这里:https ://github.com/rails/rails/blob/6c8982fa137421eebdc55560d5ebd52703b65c65/actionpack/lib/action_dispatch/http/request.rb#L160

于 2011-05-18T11:17:56.310 回答
0

对参数和用户 id 等使用这样的代码,注意格式选项与 id 和nested_attributes 等其他参数的哈希值相同。

put :update, {id: record.id, nested_attributes: {id: 1, name: "John"}, format: :js}, user.id
于 2014-02-18T19:14:54.573 回答
0

上面的许多答案已经过时了。

在 RSpec 3+ 中执行此操作的正确方法是post some_path, xhr: true.

尝试使用时直接来自 RSpec 本身的弃用警告xhr :post, "some_path"

DEPRECATION WARNING: `xhr` and `xml_http_request` are deprecated and will be removed in Rails 5.1.
Switch to e.g. `post comments_path, params: { comment: { body: 'Honey bunny' } }, xhr: true`.

此外,还会xhr :post, "some_path"导致一些post some_path, xhr: true.

于 2017-08-05T03:20:58.257 回答
0

我有类似的问题:

# controller
def create
  respond_to do |format|
    format.js
  end
end

# test

test "call format js" do
  record = promos(:one)
  post some_url(record)
  assert true
end

结果是这样的:

> rails test
Error:
ActionController::UnknownFormat: ActionController::UnknownFormat

我通过对测试的调整来修复它(添加标题):

test "call format js" do
  record = promos(:one)
  headers = { "accept" => "text/javascript" }
  post some_url(record), headers: headers
  assert true
end

导轨(6.0.0.beta3)

于 2019-06-19T06:31:14.183 回答