Подтвердить что ты не робот

В Rails, как вы используете функциональный тест формата ответа Javascript?

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

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) без выполнения действия контроллера!

4b9b3361

Ответ 1

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

get :index, :format => 'js'

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

Ответ 2

с rspec:

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

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

respond_to do |format|
  format.js
end

Ответ 3

Задайте для принятого типа контента требуемый тип:

@request.accept = "text/javascript"

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

Ответ 4

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

@request.env['HTTP_ACCEPT'] = 'text/javascript'

Ответ 5

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

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

Они заставляют контроллер использовать шаблон js (например, index.js.erb)

В то время как для имитации запроса XHR (например, для получения фрагмента HTML) вы можете использовать это: @request.env['HTTP_X_REQUESTED_WITH'] = "XMLHttpRequest"

Это означает request.xhr? вернет true.

Обратите внимание, что при моделировании 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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

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