В Rails, как вы тестируете формат ответа Javascript? - PullRequest
34 голосов
/ 01 марта 2010

Если действие вашего контроллера выглядит следующим образом:

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

и ваш функциональный тест выглядит так:

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

выполнит ветвь HTML блока response_to.

Если вы попробуете это:

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

выполняет представление (index.js.erb) без ВЫПОЛНЕНИЯ действия контроллера!

Ответы [ 9 ]

59 голосов
/ 01 марта 2010

Передайте :format с вашими обычными параметрами, чтобы вызвать ответ в этом формате.

get :index, :format => 'js'

Не нужно связываться с заголовками ваших запросов.

25 голосов
/ 12 июня 2010

с rspec:

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

и в действии вашего контроллера:

respond_to do |format|
  format.js
end
5 голосов
/ 01 марта 2010

Установите в качестве допустимого типа контента нужный тип:

@request.accept = "text/javascript"

Объедините это с вашим get :index тестом, и он сделает соответствующий вызов контроллеру.

3 голосов
/ 01 марта 2010

Используйте это перед запросом:

@request.env['HTTP_ACCEPT'] = 'text/javascript'
1 голос
/ 20 июля 2018

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 сработало для меня.

1 голос
/ 18 мая 2011

Эти три, кажется, эквивалентны:

  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

0 голосов
/ 19 июня 2019

У меня была похожая проблема:

# 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)

0 голосов
/ 05 августа 2017

Многие из приведенных выше ответов устарели.

Правильный способ сделать это в 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.

0 голосов
/ 18 февраля 2014

Используйте такой код для параметров, идентификатора пользователя и т. Д., Обратите внимание, что опция формата находится в том же хеше других параметров, как id и nested_attributes.

put :update, {id: record.id, nested_attributes: {id: 1, name: "John"}, format: :js}, user.id
...