2010-03-01 4 views
31

Если действие контроллера выглядит следующим образом:В Rails, как вы используете функциональный тест формата ответа Javascript?

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

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

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

он будет выполнять HTML ветвь блока respond_to.

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

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

он выполняет вид (index.js.erb), не выполнив действия контроллера!

ответ

55

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

get :index, :format => 'js' 

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

+2

Примечание: в Rails 3 вы можете использовать символы, выглядящие аккуратно. 'get: index, format:: js' – dazonic

+9

@ dazonic вы уверены, что это произошло не только из-за Ruby 1.9? –

+0

Обновления 2016 года: https://github.com/rspec/rspec-rails/issues/950. Это вызовет ошибку InvalidCrossOriginRequest. Используйте ответ от @steven ниже :) –

3

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

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

Установите обслуживаемый тип содержимого к типу вы хотите:

@request.accept = "text/javascript" 

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

25

с RSpec:

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

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

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? вернет 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

+1

Чтобы имитировать запрос XHR, а не возиться с @ request.env, лучше использовать предоставленный помощник: xhr: get,: index, format: "html" – Nick

0

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

put :update, {id: record.id, nested_attributes: {id: 1, name: "John"}, format: :js}, user.id 
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.