W Rails, jak przetestować format odpowiedzi Javascript?

Jeśli akcja kontrolera wygląda tak:

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

A twój test funkcjonalny wygląda tak:

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

Wykona HTML gałąź bloku respond_to.

Jeśli spróbujesz tego:

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

Wykonuje widok (indeks.js.erb) bez uruchamiania akcji kontrolera!

Author: Teflon Ted, 2010-03-01

9 answers

Podaj :format z normalnymi paramami, aby wywołać odpowiedź w tym formacie.

get :index, :format => 'js'

Nie trzeba mieszać z nagłówkami żądań.

 62
Author: Alex Wayne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-24 17:44:07

Z rspec:

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

I w akcji kontrolera:

respond_to do |format|
  format.js
end
 25
Author: Steven Soroka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-12 06:23:27

Ustaw akceptowany typ zawartości na typ, który chcesz:

@request.accept = "text/javascript"

Połącz to z Twoim testem get :index, A wykonasz odpowiednie wywołanie do kontrolera.

 5
Author: Craig Walker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-01 19:28:57

RSpec 3.7 i Rails 5.rozwiązanie x:

Kilka z tych odpowiedzi było trochę nieaktualnych w moim przypadku, więc postanowiłem podać odpowiedź dla tych, którzy działają Rails 5 i RSpec 3.7:

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

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

Bardzo podobna do odpowiedzi Steve ' a z kilkoma poprawkami. Pierwsza z nich xhr jest przekazywana jako klucz/para logiczna. Po drugie, używam teraz expect ze względu na otrzymywanie ostrzeżeń o deprecacji, jeśli są używane. Porównanie content_type odpowiedzi do text/javascript zadziałało dla mnie.

 5
Author: Carl Edwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-18 14:03:46

Użyj tego przed żądaniem:

@request.env['HTTP_ACCEPT'] = 'text/javascript'
 3
Author: Edgard Arakaki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-01 18:58:44

Te trzy wydają się być równoważne:

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

Powodują, że kontroler używa szablonu js (np. index.js.erb)

Podczas symulacji żądania XHR (np. aby uzyskać fragment HTML) możesz użyć tego: @request.env['HTTP_X_REQUESTED_WITH'] = "XMLHttpRequest"

Oznacza to żądanie.xhr? powróci prawda.

Zauważ, że podczas symulacji XHR musiałem podać oczekiwany format lub dostałem błąd:

get :index, format: "html"

Testowane Na Rails 3.0.3.

I got ten ostatni ze źródła Rails, tutaj: https://github.com/rails/rails/blob/6c8982fa137421eebdc55560d5ebd52703b65c65/actionpack/lib/action_dispatch/http/request.rb#L160

 1
Author: Jamie Cobbett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-18 11:38:53

Użyj takiego kodu dla parametrów i id użytkownika itp., zauważ, że opcja format jest w tym samym hashu innych parametrów jak id i nested_attributes.

put :update, {id: record.id, nested_attributes: {id: 1, name: "John"}, format: :js}, user.id
 0
Author: Gongqin Shen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-18 19:14:54

Wiele z powyższych odpowiedzi jest nieaktualnych.

Poprawnym sposobem na zrobienie tego w RSpec 3+ jest post some_path, xhr: true.

Ostrzeżenie przed deprecjacją prosto z samego RSpec, przy próbie użycia 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`.

Również, xhr :post, "some_path" powoduje kilka dziwnych błędów, które nie zdarzają się z post some_path, xhr: true.

 0
Author: the12,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-05 03:20:58

Miałem podobny problem:

# 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

A wynik był taki:

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

Poprawiłem to tym dopasowaniem do testu (dodawanie nagłówków):

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

Rails (6.0.0.beta3)

 0
Author: mario199,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-19 06:31:14