Ответ 1
Перейдите в :format
с вашими нормальными параметрами, чтобы вызвать ответ в этом формате.
get :index, :format => 'js'
Не нужно связываться со своими заголовками запросов.
Если действие вашего контроллера выглядит следующим образом:
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) без выполнения действия контроллера!
Перейдите в :format
с вашими нормальными параметрами, чтобы вызвать ответ в этом формате.
get :index, :format => 'js'
Не нужно связываться со своими заголовками запросов.
с rspec:
it "should render js" do
xhr :get, 'index'
response.content_type.should == Mime::JS
end
и в действии вашего контроллера:
respond_to do |format|
format.js
end
Задайте для принятого типа контента требуемый тип:
@request.accept = "text/javascript"
Объедините это с тестом get :index
, и он сделает соответствующий вызов контроллеру.
Используйте это перед запросом:
@request.env['HTTP_ACCEPT'] = 'text/javascript'
Эти три кажутся эквивалентными:
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
Решение 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
сработало для меня.
Используйте такой код для параметров и идентификатора пользователя и т.д., обратите внимание, что опция формата находится в одном и том же хэше других параметров, таких как id и nested_attributes.
put :update, {id: record.id, nested_attributes: {id: 1, name: "John"}, format: :js}, user.id
Многие из вышеперечисленных ответов устарели.
Правильный способ сделать это в 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
.
У меня была похожая проблема:
# 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)